【发布时间】:2011-08-01 19:32:01
【问题描述】:
该应用程序是用 Delphi XE 编写的。
我有两个类,一个 TBoss 和 TWorker,它们都是基于 TThread 的。 TBoss是单实例线程,启动后会创建大约20个TWorker线程。
当老板创建一个 TWorker 实例时,它会为其分配一个调用同步的方法,当 Worker 完成它正在做的事情时,它会调用此方法,该方法允许 Boss 访问 Worker 上的记录。
但是我觉得这是个问题,调用 synchronize 似乎会锁定整个应用程序 - 阻塞主 (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;
然后在我的 Boss 线程中我会做这样的事情
var
Worker : TWorker;
begin
Worker := TWorker.Create;
Worker.OnTerminate := OnWorkerThreadTerminate;
Worker.OnSendResult := ProcessWorkerResults;
所以我的老板有一个名为 ProcessWorkerResults 的方法——这就是在 Synchronize(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 年以来有一些新选项)?
-
我认为使用消息在线程之间传递数据,它不需要“应用程序”同步机制(它在线程“框架”中),比在共享数据周围使用同步原语要优雅得多.
标签: multithreading delphi synchronization delphi-xe