【问题标题】:How to use visual controls in Indy? (Delphi)如何在 Indy 中使用视觉控件? (德尔福)
【发布时间】:2010-11-30 19:15:44
【问题描述】:

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

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

    在除主线程之外的任何线程中不修改 VCL 对象的相同规则在这里也有效。您不应更改 OnExecute 事件处理程序中的任何 VCL 控件,因为该代码将在 Indy 为每个连接生成的工作线程的上下文中运行。

    如果您需要更改图形用户界面,请使用 Synchronize 或 Queue 方法,或使用自定义通知机制通知主线程为您进行 GUI 修改。

    如果你想调用 Synchronize 或 Queue 方法,你必须将 TIdYarn 类型转换为 TIdYarnOfThread,它派生自 TIdYarn 并使用线程实现它:

    // 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);
    

    【讨论】:

    • Tthread 在 D7+ 中具有静态 Synchronize() 和 Queue() 方法,因此您无需直接访问 Yarn 的内部。或者,改用 Indy 的 TIdSync 和 TIdNotify 类,它们会为您处理这些细节。
    • @Remy,谢谢;专门用于 Indy 中的 TIdSync 和 TIdNotify;我不知道他们。
    • 最好使用 TidNotify,因为如果主 vcl 线程等待 worker 终止并且 worker 在主 vcl 线程中等待 tidsynch 方法完成,TidSynch 可能会导致死锁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多