【问题标题】:Using anonymous function with TIdSync使用带有 TIdSync 的匿名函数
【发布时间】:2014-07-26 08:07:14
【问题描述】:


基于此answer,我可以将我的函数与主线程同步。感谢answer,我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数不同(计数或类型)。

问:我可以将匿名函数与 TIdSync(或任何其他解决方案)一起使用,从而无需为各种过程定义多个类吗?

【问题讨论】:

    标签: delphi delphi-xe2 indy


    【解决方案1】:

    TIdSyncTIdNotify 不支持匿名过程/函数,因为这将是多余的,因为 TThread.Synchronize()TThread.Queue() 本身支持匿名过程(并且它们具有不需要 TThread 对象的静态重载,当您使用非 RTL 线程时)。例如:

    procedure TMyThread.Execute;
    begin
      ...
      Synchronize(
        procedure
        begin
          SomeFunction(Param1, Param2, Param2);
        end
      ...
      Queue(
        procedure
        begin
          SomeFunction(Param1, Param2, Param2);
        end
      );
      ...
    end;
    

    // CreateThread() procedure
    function MyThreadProc(pv: Pointer): DWORD; stdcall;
    begin
      ...
      TThread.Synchronize(nil,
        procedure
        begin
          SomeFunction(Param1, Param2, Param2);
        end
      );
      ...
      TThread.Queue(nil,
        procedure
        begin
          SomeFunction(Param1, Param2, Param2);
        end
      );
      ...
      Result := 0;
    end;
    

    TIdSync 只是 TThread.Synchronize() 的包装器,TIdNotify 只是 TThread.Queue() 的包装器。它们是在所有TThread 可用的时间都是非静态非匿名Synchronize() 方法时引入的。随着在 TThread 中引入静态方法和匿名过程,它现在几乎可以完成 TIdSyncTIdNotify 设计的所有工作,从而降低了它们的相关性(当然它们仍然有效)。

    【讨论】:

    • 谢谢。好资料。抱歉回复晚了。但是SomeFunction 没有按预期执行。似乎SomeFunction(或SomeFunction有时会执行)没有收到一些数据包。 SomeFunction 也非常适合 TIdSync 方法。它也适用于同步。我搜索了一下,在最后一条评论中的link 中,Michael Schnell 有关于TThread.Queue 的通知,但我不明白如何照顾。谢谢。
    • TIdSync 只是调用TThread.Synchronize()TThread.Queue() 使用与TThread.Synchronize() 相同的队列。他们都将请求放入全局队列中,以供主线程在空闲时处理。因此,如果SomeFunction() 未被调用,则主线程不会处理同步请求,这将同样影响TThreadTIdSyncTIdNotify
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2012-05-31
    • 2012-10-15
    相关资源
    最近更新 更多