使用TIdSync的匿名函数

时间:2014-07-26 08:07:15

标签: delphi delphi-xe2 indy


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

问:我可以在TIdSync(或任何其他解决方案)中使用匿名函数,因此不需要为各种过程定义多个类吗?

1 个答案:

答案 0 :(得分:2)

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

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设计的所有操作,使它们不那么相关(但它们仍然可以工作,疗程)。