如何在Indy中使用可视化控件?(Delphi)

4

我的服务器必须打印一些关于其工作的报告。在OneExecute事件中,我如何使用标签、编辑框等可视化对象呢?

1个回答

4
相同的规则也适用于此处,即不要在除主线程外的任何线程中修改VCL对象。您不应该在OnExecute事件处理程序中更改任何VCL控件,因为该代码将在Indy为每个连接生成的工作线程的上下文中运行。
如果您需要更改图形用户界面,请使用Synchronize或Queue方法,或者使用自定义通知机制通知主线程为您修改GUI。
如果您想调用Synchronize或Queue方法,则必须将TIdYarn强制转换为从TIdYarn派生并使用线程实现的TIdYarnOfThread类型:
// Calling MyMethod using Synchornize inside TIdTcpServer.OnExecute event-handler   
TIdYarnOfThread(AContext.Yarn).Thread.Synchronize(MyMethod);


// Calling MyMethod using Queue inside TIdTcpServer.OnExecute event-handler  
TIdYarnOfThread(AContext.Yarn).Thread.Queue(MyMethod);

3
TThread在D7+中具有静态的Synchronize()和Queue()方法,因此您无需直接访问Yarn的内部。或者,您可以使用Indy的TIdSync和TIdNotify类,它们会为您处理这些细节。 - Remy Lebeau
@Remy,谢谢;特别是关于Indy中的TIdSync和TIdNotify; 我之前不知道它们。 - vcldeveloper
最好使用TidNotify,因为如果主VCL线程等待工作线程终止而工作线程正在等待tidsynch方法在主VCL线程中完成,则TidSynch可能会导致死锁。 - Mike Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接