2014-07-26 62 views
0


基于此answer我可以将我的函数与主线程同步。并且由于这个answer我也可以传递参数。但问题是我必须为各种过程声明多个类,因为参数是不同的(数量或类型)。在TIdSync中使用匿名函数

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

回答

2

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设计要做的所有事情,使它们不太相关(但它们当然仍然有效)。

+0

谢谢。良好的信息。抱歉回复晚了。但是'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

+0

'TIdSync'只需调用'TThread.Synchronize()'。 'TThread.Queue()'使用'TThread.Synchronize()'使用的相同队列。他们都将一个请求放在全局队列中,以便主线程在闲暇时进行处理。因此,如果没有调用SomeFunction(),那么主线程不会处理同步请求,这会同样影响“TThread”,“TIdSync”和“TIdNotify”。 –