我正在使用TIdHttpServer处理一些命令,问题是某些命令丢失了我的猜测是因为我正在更新OnConnect中的vcl。
如何使用Synchronize方法来更新VCL?
答案 0 :(得分:3)
Indy有自己的TIdSync
和TIdNotify
类,分别用于以同步和异步方式与主线程同步。从TIdSync
派生一个新类并覆盖其DoSynchronize()
方法,或从TIdNotify
派生并覆盖其DoNotify()
方法。
更新:请注意,现在这些类在很大程度上已被弃用,而采用的是Delphi自己的TThread.Synchronize()
和TThread.(Force)Queue()
方法的静态版本,它们的工作方式与{ {1}} / TIdSync
最初设计用于TIdNotify
仍然只支持非静态TThread
。
答案 1 :(得分:1)
这很简单,只需使用GUI线程调用的TThread.Synchronize()
调用TThreadMethod
即可。 TThreadMethod
是无参数procedure of object
,但由于调用的辅助线程被阻塞,直到GUI线程执行synchronized方法之后,您可以在synchronized方法中使用TThread
成员没有任何进一步的保护。
只是为了完整,我应该提到有几种选择,所有这些都更好(即使那些我没有尝试过,因为没有什么可能更糟)。 Indy具有TIdSync
和TIdNotify
类,您可以从中派生这些类来携带变量并实现自定义方法。较新的Delphi版本具有TThread.Queue()
和TThread.ForceQueue()
,它们可以使用匿名方法生成闭包(使用捕获的变量),这些闭包可以由GUI线程执行而不会阻塞调用线程。还有PostMessage()
和PostThreadMessage()
API - 自D3 / W95以来一直没有变化的通信系统,并且肯定会在Windows上永久可用。