【问题标题】:Update a VCL component from CreateAnonymousThread从 CreateAnonymousThread 更新 VCL 组件
【发布时间】:2011-10-08 01:12:22
【问题描述】:

似乎无法从使用CreateAnonymousThread 创建的线程中使用哪个Synchronize,所以问题是:How i can update a VCL component from inside of a Thread created using CreateAnonymousThread?

TThread.CreateAnonymousThread(procedure
 begin
  //do something
  UpdateCompnent();//how I can update a VCL component from here?   
 end
).Start;

【问题讨论】:

    标签: multithreading delphi delphi-xe


    【解决方案1】:

    您可以在这种情况下使用同步,例如:

    TThread.Synchronize(nil, procedure begin UpdateComponent(); end);
    

    如果你想在主线程中异步方法调用执行,你可以使用TThread.Queue,例如:

    TThread.Queue(nil, procedure begin UpdateComponent(); end);
    

    【讨论】:

    • @David:OP 使用/询问同步可能只是因为他想避免线程问题,不一定是因为他需要同步执行。
    【解决方案2】:

    您还可以使用 PostMessage 安全地排队,或使用 SendMessage 安全地从匿名线程同步。

    【讨论】:

    • +,因为我总是更喜欢 PostMessage 组件同步而不是 Synchronize 方法:没有死锁的机会,没有在工作线程中等待。但这确实需要更多的工作。
    • PostMessage 无法与 Synchronize 相提并论。
    • 如果您需要从后台线程获取一点数据(状态)并输出到前台线程,安全、快速且没有副作用或错误,完全可以相提并论。
    【解决方案3】:

    你可以使用 PostMessage(Form.Handle, WM_UPDATEMYCOMP, 0, 0);

    你可以定义自己的message id、wparam、lparam,稍加工作就可以把它们变成更复杂的参数。

    【讨论】:

    • 在这种情况下,您的意思是 SendMessage 而不是 PostMessage。
    • 请注意,从工作线程上下文访问 TWinControl.Handle 属性不是线程安全的。如果在此期间正在重新创建Handle,例如通过调用TWinControl.RecreateWnd(),那么线程最终会接管新的HWND(并且主线程泄漏HWND),导致TForm 停止正常工作。如果您需要将消息从工作线程传递到主线程HWND,请改用TApplication.Handle 窗口或AllocateHWND() 函数。
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2011-09-15
    • 2014-03-07
    • 1970-01-01
    • 2011-10-28
    • 2011-10-27
    • 1970-01-01
    • 2023-02-20
    相关资源
    最近更新 更多