Russian Qt Forum
Апрель 18, 2024, 04:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Корутины (модное слово)  (Прочитано 21934 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Октябрь 07, 2020, 09:50 »

Уже приводил 2 раза - генератор, lazy, продьюсер-консьюмер.
Ну они мне не кажутся столь убедительными как с событийным циклом. Скорее "лямбда вместо функтора" - да, возможно/иногда получше, поудобнее, но не более того.
Ну ладно, я ведь тоже не знаю убедительных, так что претензий нет  Улыбающийся

А вообще "кооператив" - классная вещь. Это сейчас каждый засранец нитки запускает, а раньше делали по таймеру - и все прекрасно получалось. Приходилось даже диспатчить т.к. что-то делать в фоне хотели многие окна
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #46 : Октябрь 07, 2020, 12:03 »

генераторы - это очень прикольно, они позволяют экономить память - сейчас вы жонглируете временными векторами с кучей аллокаций и тому подобного, в питончике же можно оперировать над исходным контейнером "лениво" - это начинает ролять когда вы жонгируете гигабайтными матрицами.
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #47 : Октябрь 18, 2020, 18:15 »

Как уже здесь многие отмечали, концепции этой "корутины" уже сто лет в обед. Мейнстрим практика - например, в Win32 API, начиная с NT 3.51, есть функция CreateFiber (читай корутина), которая в свою очередь создавалась с целью облегчения портирования Unix-овых программ под Windows. Соответственно, в Unix-ах это API появилось ... даже не знаю когда.

Востребованность? А часто ли требуется ручное переключение контекста? Часто ли вы использовали setjump/longjump? Ну если только вы пишите специфичный инструментарий, манипулирующий контекстом, например, такой как обработка исключений (есть разные реализации, в т.ч. через setjump/longjump).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Октябрь 19, 2020, 12:48 »

Востребованность? А часто ли требуется ручное переключение контекста? Часто ли вы использовали setjump/longjump? Ну если только вы пишите специфичный инструментарий, манипулирующий контекстом, например, такой как обработка исключений (есть разные реализации, в т.ч. через setjump/longjump).
По-моему другая крайность - недооценка. Как Вы делаете драг? Наверное корутиной - ведь Вам это давно известно? Или "спагетти" с 3 событиями? Или мучаетесь с processEvents как я? Думаю что ответа не последует Улыбающийся

Др случаи эффективного применения тоже найдутся, пусть они не так уж часты. Напр конечные автоматы/пулеметы или синтаксический разбор.

Как уже здесь многие отмечали, концепции этой "корутины" уже сто лет в обед.
Так приходит старость Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #49 : Октябрь 19, 2020, 14:15 »

пусть они не так уж часты.

вся асинхронка? сетевое взаимодействие, доступ к БД. Вас не напрягает что QSqlDatabase блокирующий?
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #50 : Октябрь 19, 2020, 23:26 »

Цитировать
По-моему другая крайность - недооценка.
Возможно, лет через 5 увидим.

Драг бы делал на событиях. Собственно, у нас событийная модель программирования, а вы переходите опять к последовательной, в которой эти события все равно должны обрабатываться по ходу последовательности.

processEvents(): навскидку, нужно запилить свой эвент диспатчер (наследник QAbstractEventDispatcher), который будет иметь режим извлечения и обработки событий поштучно, т.е. QAbstractEventDispatcher::processEvents() будет извлекать одно событие и возвращать управление. По MouseRelease будет возможность завершить драг перед обработкой последующих событий, например, Esc keypress, которое в противном случае отменило бы завершившийся драг.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #51 : Октябрь 20, 2020, 10:47 »

Вас не напрягает что QSqlDatabase блокирующий?
Цитировать
- Ну как я играл ?
- В общем хорошо, но почему Вы не сделали ни одного хода конями?
- Так я не знаю как они ходют
Никогда не имел дела с QSqlDatabase, ни с др СУБД (хотя наверное скоро буду знакомиться). Все же рискну утверждать что этот пример ничего нового не вносит - ну опять-таки эффективный/удобный уход в событийный цикл, что есть - то есть.

Драг бы делал на событиях.
Не понял, что значит "бы"? Не представляю как Вам удалось отмазаться от этой работы, которая в UI всегда есть.
Собственно, у нас событийная модель программирования, а вы переходите опять к последовательной, в которой эти события все равно должны обрабатываться по ходу последовательности.
Даже чисто концептуально гораздо более естественно представить/трактовать драг как единое действие/акцию, которая и реализована должна быть одним методом/ф-цией. Эта операция имеющая начало и конец, да, в ходе ее запрашивается ввод юзера, и что, разве мы обязаны дробить код по обработчикам? Это вынуждает заводить "драговые" члены класса лишь с той целью чтобы напр в MouseMoved иметь то что было установлено в MousePressed и.т.п. Заметьте что мы сразу лишаемся возможности сделать общий класс драга, остается лишь как-то (коряво) наследовать окно. Число проблем лавинообразно нарастает с увеличением числа драгов в одном окне, мы вынуждены "свитчеваться" в каждом обработчике.

processEvents(): навскидку, нужно запилить свой эвент диспатчер (наследник QAbstractEventDispatcher), который будет иметь режим извлечения и обработки событий поштучно, т.е. QAbstractEventDispatcher::processEvents() будет извлекать одно событие и возвращать управление. По MouseRelease будет возможность завершить драг перед обработкой последующих событий, например, Esc keypress, которое в противном случае отменило бы завершившийся драг.
Если мы связываемся с processEvents, то тем самым уже признаем что хотим иметь 1 драг = 1 метод, т.е. последовательный код. Предложение перекрыть диспатчер мне кажется слишком смелым, все равно не видно как добиться "поштучной" выемки. Пробовал задействовать метод interrupt (вроде "оно"), но увы, "поштучных" событий он не гарантирует
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #52 : Октябрь 21, 2020, 08:23 »

Ну ладно, вот мы (элегантно) "махнули хвостиком" и вышли из корутины в событийный цикл. При этом надеясь что рано или поздно упр-е вернется в корутину. А если нет? Ну где-то насвистели и кто-то сожрал тот же MouseReleased. И потом приходит MousePressed по которому корутина должна запуститься "с нуля". Что произойдет? И как бороться с такими коллизиями?
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #53 : Октябрь 21, 2020, 17:58 »

Корутина - это объект с конкретным состоянием. Чтобы завершить корутину, достаточно удалить конкретный её экземпляр. Если необходимо запустить корутину "с нуля", то необходимо сформировать другой экземпляр корутины.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #54 : Октябрь 22, 2020, 12:25 »

Корутина - это объект с конкретным состоянием. Чтобы завершить корутину, достаточно удалить конкретный её экземпляр. Если необходимо запустить корутину "с нуля", то необходимо сформировать другой экземпляр корутины.
Корректный, но какой-то "казенный" (неживой) ответ.
Цитировать
А можно пример?
Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #55 : Октябрь 22, 2020, 14:39 »

легко:
Код:
{
    auto coro = getCoro();
    Q_UNUSED(coro);
}
Записан
Painter
Новичок

Offline Offline

Сообщений: 8


Просмотр профиля
« Ответ #56 : Январь 16, 2021, 22:41 »

У нас буржуи говорят, что это тупо сокращение от Code Routine и ничего больше
А это значит только одно -> код программы  Смеющийся Смеющийся Смеющийся
Просто, знатоков "аглицкого" языка все еще "хватат"  Подмигивающий
А вообще-то прыткий молодой человек в самом начале сказал, что он ничего не понял и так оно и есть,
Речь идет о теории кодирования с научной точки зрения.
« Последнее редактирование: Январь 22, 2021, 14:57 от Painter » Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 22.