首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TIdHttpServer与VCL同步

TIdHttpServer与VCL同步
EN

Stack Overflow用户
提问于 2012-03-19 22:49:48
回答 2查看 1.5K关注 0票数 1

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

如何使用Synchronize方法安全地更新VCL?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-20 00:21:49

这很简单,只需使用GUI线程希望调用的任何TThreadMethod调用TThread.Synchronize()即可。TThreadMethod是一个无参数的procedure of object,但是由于进行调用的辅助线程在GUI线程执行synchronized方法之前是被阻塞的,所以您可以在synchronized方法中使用TThread成员,而无需任何进一步的保护。

为了完善,我应该提到有几个替代方案,所有这些方案都更好(即使是那些我没有尝试过的方案,因为没有什么比这更糟糕了)。Indy有TIdSyncTIdNotify类,您可以从中派生以携带变量和实现自定义方法。较新的Delphi版本有TThread.Queue()TThread.ForceQueue(),它们可以使用匿名方法生成闭包(带有捕获的变量),这些闭包可以由GUI线程执行,而不会阻塞调用线程。还有PostMessage()和Windows这是一个通信系统,从D3/W95开始就没有变化,肯定会永远在PostThreadMessage()上使用。

票数 1
EN

Stack Overflow用户

发布于 2012-03-21 04:06:35

Indy有自己的TIdSyncTIdNotify类,分别以同步和异步方式与主线程同步。从TIdSync派生新类并重写其DoSynchronize()方法,或从TIdNotify派生并重写其DoNotify()方法。

Delphi更新:注意到,这些类现在已经被大量弃用,取而代之的是自己的静态版本的TThread.Synchronize()TThread.(Force)Queue()方法,它们所做的工作与TIdSync/TIdNotify最初设计的工作大致相同,当时TThread仍然只支持非静态Synchronize()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9772317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档