0
基于此answer我可以将我的函数与主线程同步。并且由于这个answer我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数是不同的(数量或类型)。在TIdSync中使用匿名函数
问:我可以在TIdSync(或任何其他解决方案)中使用匿名函数,因此不需要为各种过程定义多个类?
基于此answer我可以将我的函数与主线程同步。并且由于这个answer我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数是不同的(数量或类型)。在TIdSync中使用匿名函数
问:我可以在TIdSync(或任何其他解决方案)中使用匿名函数,因此不需要为各种过程定义多个类?
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方法效果很好。此外,它与Synchronize一起工作。我在最近的评论中搜索了一下,并在[link](http://delphi.about.com/b/2011/04/14/synchronizing-threads-and-gui-in-delphi-application.htm)是迈克尔施内尔关于'TThread.Queue'的通知,但我不明白如何照顾。谢谢。 – SAMPro
'TIdSync'只需调用'TThread.Synchronize()'。 'TThread.Queue()'使用'TThread.Synchronize()'使用的相同队列。他们都将一个请求放在全局队列中,以便主线程在闲暇时进行处理。因此,如果没有调用SomeFunction(),那么主线程不会处理同步请求,这会同样影响“TThread”,“TIdSync”和“TIdNotify”。 –