【发布时间】:2012-03-19 14:49:47
【问题描述】:
我正在使用 TIdHttpServer 来处理一些命令问题是一些命令正在丢失我的猜测是因为我正在更新 OnConnect 中的 vcl。
如何使用 Synchronize 方法安全更新 VCL?
【问题讨论】:
我正在使用 TIdHttpServer 来处理一些命令问题是一些命令正在丢失我的猜测是因为我正在更新 OnConnect 中的 vcl。
如何使用 Synchronize 方法安全更新 VCL?
【问题讨论】:
Indy 有自己的TIdSync 和TIdNotify 类,分别用于以同步和异步方式与主线程同步。从TIdSync 派生一个新类并覆盖其DoSynchronize() 方法,或从TIdNotify 派生并覆盖其DoNotify() 方法。
更新:请注意,现在这些类在很大程度上已被弃用,取而代之的是 Delphi 自己的 TThread.Synchronize() 和 TThread.(Force)Queue() 方法的静态版本,它们的工作与 TIdSync/@ 几乎相同当TThread 仍然只支持非静态Synchronize() 时,987654330@ 最初是为返回而设计的。
【讨论】:
这很简单,只需调用TThread.Synchronize() 与您希望GUI 线程调用的任何TThreadMethod。 TThreadMethod 是一个无参数的procedure of object,但是由于进行调用的辅助线程被阻塞,直到 GUI 线程执行了同步方法之后,您可以在同步方法中使用 TThread 成员,而无需任何进一步的保护。
为了完整起见,我应该提到有几种选择,所有这些都更好(即使是我没有尝试过的那些,因为没有比这更糟的了)。 Indy 有TIdSync 和TIdNotify 类,您可以从它们派生以携带变量和实现自定义方法。较新的 Delphi 版本有TThread.Queue() 和TThread.ForceQueue(),它们可以使用匿名方法生成可以由 GUI 线程执行而不会阻塞调用线程的闭包(带有捕获的变量)。还有 PostMessage() 和 PostThreadMessage() API - 一个自 D3/W95 以来一直工作的通信系统,并且肯定会永远在 Windows 上可用。
【讨论】: