我正在使用TIdHttpServer处理一些命令,问题是某些命令正在丢失,我的猜测是这是由于我正在更新OnConnect内的vcl。
我该如何使用Synchronize方法来安全更新VCL?
最佳答案
这很容易,只需用GUI线程要调用的任何TThread.Synchronize()
调用TThreadMethod
。 TThreadMethod
是无参数的procedure of object
,但是由于进行调用的辅助线程被阻塞,直到GUI线程执行了同步方法之后,您才可以在同步方法中使用TThread
成员,而无需任何进一步的保护。
只是为了完整起见,我应该提到有几种选择,所有这些都比较好(即使我没有尝试过,因为没有什么会更糟了)。 Indy具有TIdSync
和TIdNotify
类,您可以从中派生这些类来携带变量和实现自定义方法。较新的Delphi版本具有TThread.Queue()
和TThread.ForceQueue()
,它们可以使用匿名方法来生成闭包(带有捕获的变量),该闭包可以由GUI线程执行而不会阻塞调用线程。还有PostMessage()
和PostThreadMessage()
API-这是一种通信系统,自D3 / W95起一直运行,没有任何变化,并且肯定会在Windows上永久可用。
关于delphi - TIdHttpServer与VCL同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9772317/