线程A处理完Data后,通过OnAfterExecute事件,将Data插入到线程B的数据队列中以待处理。
问题1, OnAfterExecute是否需要用Synchronize调用?
问题2, 如果要在OnAfterExecute中访问界面控件,就得一定得用Synchronize调用,但OnAfterExecute的实现不在线程中,如何调用Synchronize?
问题1, OnAfterExecute是否需要用Synchronize调用?
问题2, 如果要在OnAfterExecute中访问界面控件,就得一定得用Synchronize调用,但OnAfterExecute的实现不在线程中,如何调用Synchronize?
procedure AThread.Execute;
begin
...
if Assigned(FOnAfterExecute) then begin
FOnAfterExecute(FData);
end;
end;因为AThread只负责处理FData,处理完后该怎么做,交给OnAfterExecute事件去完成。
OnAfterExecute需要做两件事,一是将FData添加到BThread的待处理数据队列中,二是在界面上显示当前的处理情况。
大至情况这是这样,线程之间如何同步?
begin
if Assigned(FOnAfterExecute) then
FOnAfterExecute(FData);
end;procedure AThread.Execute;
begin
...
Synchronize(DoAfterExecute);
end;
當然有一個技巧,建議樓主不要使用事件,而是使用自定義消息,當線程執行完Execute代碼時,使用SendMessage發送消息給主線程,主線程接收到消息後,完成原來是在OnAfterExecute事件內完成的工作,這樣的話不必做同步。
但是如果你使用事件的話,實際上還是在AThread類的線程中執行,調用Synchronize是必須的。