等待所有队列事件完成?

Wait for all Queue events done?

提问人:Mike Versteeg 提问时间:11/29/2022 更新时间:11/30/2022 访问量:112

问:

在主线程中异步运行函数时,例如

TThread::CurrentThread->Queue(NULL, somefunction);

在关闭我的应用程序之前,我想确保所有事件都已完成。但我能找到的只是一种删除待处理事件的方法

TThread::CurrentThread->RemoveQueuedEvents(somefunction);

如何等待它们完成而不是全部删除?

C++builder rad-studio c++builder-11-亚历山大

评论

1赞 Remy Lebeau 11/30/2022
仅供参考,有一个重载,所以你不需要用它来调用它:Queue()staticCurrentThreadTThread::Queue(NULL, 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
我的第一个建议可以在函数周围使用一些帮助程序包装器来简化/更干净,因此函数本身不必担心计数器。我的第二个建议将处理队列中的任何内容,您只需先停止线程,这样队列就不会再更改了。