Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何中断TThread.Synchronize()?_Delphi_C++builder - Fatal编程技术网

Delphi 如何中断TThread.Synchronize()?

Delphi 如何中断TThread.Synchronize()?,delphi,c++builder,Delphi,C++builder,关闭应用程序时,我希望等待所有工作线程关闭,但如果其中一个工作线程刚刚调用了Synchronize,这将导致死锁。那么有没有中断同步的方法呢 我使用的是C++Builder 2010。理想情况下,停止使用Synchronize——就像大多数方便和简单的工具一样,它有着可怕的局限性。如果您真的需要让线程等待,则将消息发布到主线程,并等待类似TEvent的消息。这样,如果需要解除工作线程的阻塞,就可以简单地向事件发送信号。否则,在ProcessMessages上旋转直到完成所有操作。后者显然应该感觉

关闭应用程序时,我希望等待所有工作线程关闭,但如果其中一个工作线程刚刚调用了Synchronize,这将导致死锁。那么有没有中断同步的方法呢


我使用的是C++Builder 2010。

理想情况下,停止使用Synchronize——就像大多数方便和简单的工具一样,它有着可怕的局限性。如果您真的需要让线程等待,则将消息发布到主线程,并等待类似TEvent的消息。这样,如果需要解除工作线程的阻塞,就可以简单地向事件发送信号。否则,在ProcessMessages上旋转直到完成所有操作。后者显然应该感觉是一个丑陋的解决方案…举例说明为什么同步也是一个丑陋的解决方案。即使在调用TThread.WaitFor时调用CheckSynchronize,也有可能发生死锁的情况。有关可能的解决方法,请参阅。另请参阅本文。最简单的解决方法是永远不要使用同步。请改用异步TThread.Queue或PostMessage。@LURD只要让回调本身决定使用Synchronize或Queue,或者如果使用者再也不能处理回调,就不使用它们。我建议在窗体的CanClose上生成一个新线程,它可能会等待其他线程完成。这是终止你的应用程序的最干净的方式,并且会进行不必要的同步调用。