该应用程序使用Delphi XE编写。在线程间同步/发送数据
我有两个类,一个TBoss和TWorker,它们都是基于TThread的。 TBoss是一个单实例线程,它启动后会创建约20个TWorker线程。
当老板创建一个TWorker实例时,它会为其分配一个调用同步的方法,当Worker完成它正在做的事情时,它调用这个方法,该方法允许Boss访问Worker上的记录。
但是我觉得这是一个问题,调用同步似乎锁定了整个应用程序 - 阻止主(UI)线程。真的,它应该只是同步该工作者与老板线程...
以前我用消息/打包的记录发送线程之间的内容运行良好。然而,这样做更清洁,更好....只是非常封锁。
有没有办法在worker中调用Syncronize来等待Boss线程?
我的代码:
type
TWorker = class(TThread)
private
fResult : TResultRecord;
procedure SetOnSendResult(const Value: TNotifyEvent);
....
....
public
property OnSendResult: TNotifyEvent write SetOnSendResult;
property Result : TResultRecord read fResult;
....
end;
...
...
procedure TWorker.SendBossResults;
begin
if (Terminated = False) then
begin
Synchronize(SendResult);
end;
end;
procedure TWorker.SendResult;
begin
if (Terminated = false) and Assigned(FOnSendResult) then
begin
FOnSendResult(Self);
end;
end;
然后在我的老板线程,我会做这样的事情
var
Worker : TWorker;
begin
Worker := TWorker.Create;
Worker.OnTerminate := OnWorkerThreadTerminate;
Worker.OnSendResult := ProcessWorkerResults;
所以我的老板则有一个方法叫ProcessWorkerResults - 这就是被运行同步(SendResult);的工人。
procedure TBoss.ProcessWorkerResults(Sender: TObject);
begin
if terminated = false then
begin
If TWorker(Sender).Result.HasRecord then
begin
fResults.Add(TWorker(Sender).Result.Items);
end;
end;
end;
哪个Delphi版本(自2009年以来有一些新的选择)? – mjn 2011-04-08 20:49:56
Delphi XE - 谢谢 – Wizzard 2011-04-08 21:07:02
我认为使用消息在线程之间传递数据,不需要“应用程序”同步机制(它在线程“框架”中),比在共享数据周围使用同步原语要优雅得多。 – Misha 2012-02-10 06:00:52