我正在使用TIdHttpServer处理一些命令,问题是一些命令正在丢失,我猜这是因为我正在更新OnConnect中的vcl。
如何使用Synchronize方法安全地更新VCL?
发布于 2012-03-20 00:21:49
这很简单,只需使用GUI线程希望调用的任何TThreadMethod调用TThread.Synchronize()即可。TThreadMethod是一个无参数的procedure of object,但是由于进行调用的辅助线程在GUI线程执行synchronized方法之前是被阻塞的,所以您可以在synchronized方法中使用TThread成员,而无需任何进一步的保护。
为了完善,我应该提到有几个替代方案,所有这些方案都更好(即使是那些我没有尝试过的方案,因为没有什么比这更糟糕了)。Indy有TIdSync和TIdNotify类,您可以从中派生以携带变量和实现自定义方法。较新的Delphi版本有TThread.Queue()和TThread.ForceQueue(),它们可以使用匿名方法生成闭包(带有捕获的变量),这些闭包可以由GUI线程执行,而不会阻塞调用线程。还有PostMessage()和Windows这是一个通信系统,从D3/W95开始就没有变化,肯定会永远在PostThreadMessage()上使用。
发布于 2012-03-21 04:06:35
Indy有自己的TIdSync和TIdNotify类,分别以同步和异步方式与主线程同步。从TIdSync派生新类并重写其DoSynchronize()方法,或从TIdNotify派生并重写其DoNotify()方法。
Delphi更新:注意到,这些类现在已经被大量弃用,取而代之的是自己的静态版本的TThread.Synchronize()和TThread.(Force)Queue()方法,它们所做的工作与TIdSync/TIdNotify最初设计的工作大致相同,当时TThread仍然只支持非静态Synchronize()。
https://stackoverflow.com/questions/9772317
复制相似问题