基于此answer我可以将我的函数与主线程同步。感谢这个answer我也可以传递参数。但问题是我必须为各种程序声明多个类,因为参数不同(计数或类型)。
问:我可以在TIdSync(或任何其他解决方案)中使用匿名函数,因此不需要为各种过程定义多个类吗?
答案 0 :(得分:2)
TIdSync
和TIdNotify
不支持匿名过程/函数,因为它是多余的,因为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
中引入静态方法和匿名过程,它现在可以完成TIdSync
和TIdNotify
设计的所有操作,使它们不那么相关(但它们仍然可以工作,疗程)。