提问人:Mike Versteeg 提问时间:11/29/2022 更新时间:11/30/2022 访问量:112
等待所有队列事件完成?
Wait for all Queue events done?
问:
在主线程中异步运行函数时,例如
TThread::CurrentThread->Queue(NULL, somefunction);
在关闭我的应用程序之前,我想确保所有事件都已完成。但我能找到的只是一种删除待处理事件的方法
TThread::CurrentThread->RemoveQueuedEvents(somefunction);
如何等待它们完成而不是全部删除?
答:
0赞
Remy Lebeau
11/30/2022
#1
不幸的是,RTL 并没有真正提供一种机制来满足您的要求,至少不是直接的。
您可以尝试使用线程安全计数器,该计数器在每次函数排队时递增,每次排队的函数退出时递减。然后,主线程可以在循环中调用 CheckSynchronize(),
直到该计数器达到 0。
或者,您可以简单地终止所有工作线程,确保它们已完全终止,然后只需调用 1 次来处理最终队列,因为不会再向其添加新条目。CheckSynchronize()
评论
0赞
Mike Versteeg
11/30/2022
我已经尝试了您的第一个解决方案,但代码不适合我。您的第二个解决方案听起来很有趣,但我认为这行不通,因为我有多个线程添加到队列中,这反过来又更新了一个 TMemo(日志记录)。我更喜欢在销毁备忘录之前让所有事件完成(而不是删除它们)。
0赞
Mike Versteeg
11/30/2022
我想知道谁想到写一个 Remove 而不是 WaitFor..无论如何,有效的答案,谢谢。
0赞
Remy Lebeau
11/30/2022
我的第一个建议可以在函数周围使用一些帮助程序包装器来简化/更干净,因此函数本身不必担心计数器。我的第二个建议将处理队列中的任何内容,您只需先停止线程,这样队列就不会再更改了。
评论
Queue()
static
CurrentThread
TThread::Queue(NULL, somefunction);