【发布时间】:2014-07-26 08:07:14
【问题描述】:
基于此answer,我可以将我的函数与主线程同步。感谢answer,我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数不同(计数或类型)。
问:我可以将匿名函数与 TIdSync(或任何其他解决方案)一起使用,从而无需为各种过程定义多个类吗?
【问题讨论】:
标签: delphi delphi-xe2 indy
基于此answer,我可以将我的函数与主线程同步。感谢answer,我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数不同(计数或类型)。
问:我可以将匿名函数与 TIdSync(或任何其他解决方案)一起使用,从而无需为各种过程定义多个类吗?
【问题讨论】:
标签: delphi delphi-xe2 indy
TIdSync 和 TIdNotify 不支持匿名过程/函数,因为这将是多余的,因为 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 中引入静态方法和匿名过程,它现在几乎可以完成 TIdSync 和 TIdNotify 设计的所有工作,从而降低了它们的相关性(当然它们仍然有效)。
【讨论】:
SomeFunction 没有按预期执行。似乎SomeFunction(或SomeFunction有时会执行)没有收到一些数据包。 SomeFunction 也非常适合 TIdSync 方法。它也适用于同步。我搜索了一下,在最后一条评论中的link 中,Michael Schnell 有关于TThread.Queue 的通知,但我不明白如何照顾。谢谢。
TIdSync 只是调用TThread.Synchronize()。 TThread.Queue() 使用与TThread.Synchronize() 相同的队列。他们都将请求放入全局队列中,以供主线程在空闲时处理。因此,如果SomeFunction() 未被调用,则主线程不会处理同步请求,这将同样影响TThread、TIdSync 和TIdNotify。