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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: waitForDone  (Прочитано 11856 раз)
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #30 : Июль 07, 2021, 22:11 »

Смысл в том, чтобы запустить параллельную задачу, встать на wait_condition и ждать пока в лямбде этот wait_condition не занатифает кто либо из параллельного потока.
Это понял, но тогда надо засисять доступ к fullConfig (по сути очередь), а делать это обычно неудобно, напр очередь пуста, но последняя задача еще тикает.

Конечно охаять чужой код - много ума не надо, но впечатление что с "современным С++" забот заметно больше - и очередь (аналог), и примитив синхронизации - все то чего хотелось избежать Улыбающийся

Да, а "послать чистый лист бумаги" - так никто и не допер? Плачущий Не может быть, наверное это просто "слишком очевидно"  Улыбающийся
вместо условия !fullConfig.empty() можно завести свой булевый флаг в фоновом треде, который будет означать отсутствие активных задач.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Июль 08, 2021, 05:18 »

вместо условия !fullConfig.empty() можно завести свой булевый флаг в фоновом треде, который будет означать отсутствие активных задач.
Воркер четко знает что задача завершена (он ее выполнял), но не может поручиться за отсутствие, ведь задачи посылаются главной. Парить атомарный счетчик (++ в главной, -- в воркере) - да, есть такой вариант, неплохой, позволяет работать чисто сигналами.

Второй вариант в духе "анти-велик", использование Qt инструментария
Код
C++ (Qt)
void waitForDone( void )
{
emit SignalEmptyBlank();  // BlockingQueuedConnection
}
Слот пустой, но он получит упр-е после всех предыдущих сигналов, т.е. когда желанный "done" наступил.

Ну и легким движением руки это превращается в асинхронку. Не умаляя заслуг std/boost замечу что потребности в них здесь никакой
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #32 : Июль 08, 2021, 09:45 »

Следующим этапом может быть use-case когда надо подождать, но какое то конечное время.
С пустым сигналом просто будет deadlock на все приложение если фоновый поток заблокируется. Ну мало ли, из сети что то не пришло, или файла какого нибудь на месте не оказалось.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Июль 08, 2021, 13:09 »

Следующим этапом может быть use-case когда надо подождать, но какое то конечное время.
С пустым сигналом просто будет deadlock на все приложение если фоновый поток заблокируется. Ну мало ли, из сети что то не пришло, или файла какого нибудь на месте не оказалось.
Резонный запрос. Я бы делал так
Код
C++ (Qt)
QSemaphore sem;
emit SignalDone(&sem);
sem.tryAcquire(1, timeOut);
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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