При асинхронном запуске функции в основном потоке, например
TThread::CurrentThread->Queue(NULL, somefunction);
перед закрытием моего приложения я хотел бы убедиться, что все события завершены. Но все, что я могу найти, это способ удалить ожидающие события
TThread::CurrentThread->RemoveQueuedEvents(somefunction);
Как мне дождаться их завершения вместо того, чтобы удалить все?
К сожалению, RTL на самом деле не предоставляет механизма для выполнения того, о чем вы просите, по крайней мере, напрямую.
Вы можете попробовать использовать потокобезопасный счетчик, который увеличивается каждый раз, когда функция ставится в очередь, и уменьшается каждый раз, когда функция, поставленная в очередь, выходит. Затем основной поток может вызывать CheckSynchronize() в цикле, пока этот счетчик не достигнет 0.
Или вы можете просто завершить все свои рабочие потоки, убедиться, что они полностью завершены, а затем просто вызвать CheckSynchronize()
1 раз, чтобы обработать последнюю очередь, поскольку в нее больше не будут добавляться новые записи.
Я уже пробовал ваше первое решение, но код мне просто не подходил. Ваше второе решение звучит интересно, но я не думаю, что оно сработает, поскольку в очередь добавляются несколько потоков, которые, в свою очередь, обновляют TMemo (ведение журнала). Я предпочитаю, чтобы все события завершились (вместо того, чтобы удалять их), прежде чем уничтожить заметку.
Интересно, кто додумался написать Remove, а не WaitFor. В любом случае, правильный ответ, так что спасибо.
Мое 1-е предложение можно сделать проще/чище, используя некоторые вспомогательные оболочки вокруг функций, поэтому самим функциям не нужно беспокоиться о счетчике. Мое второе предложение будет обрабатывать все, что находится в очереди, вы просто сначала остановите потоки, чтобы очередь больше не менялась.
К вашему сведению,
Queue()
имеет перегрузкуstatic
, поэтому вам не нужно использоватьCurrentThread
для его вызова:TThread::Queue(NULL, somefunction);