TIdHttpServer与VCL同步

时间:2012-03-19 14:49:48

标签: delphi indy

我正在使用TIdHttpServer处理一些命令,问题是某些命令丢失了我的猜测是因为我正在更新OnConnect中的vcl。

如何使用Synchronize方法来更新VCL?

2 个答案:

答案 0 :(得分:3)

Indy有自己的TIdSyncTIdNotify类,分别用于以同步和异步方式与主线程同步。从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具有TIdSyncTIdNotify类,您可以从中派生这些类来携带变量并实现自定义方法。较新的Delphi版本具有TThread.Queue()TThread.ForceQueue(),它们可以使用匿名方法生成闭包(使用捕获的变量),这些闭包可以由GUI线程执行而不会阻塞调用线程。还有PostMessage()PostThreadMessage() API - 自D3 / W95以来一直没有变化的通信系统,并且肯定会在Windows上永久可用。