Приложение написано на Delphi XE.
У меня есть два класса, TBoss и TWorker, которые оба основаны на TThread.TBoss - это отдельный экземплярный поток, который запускается, а затем создает около 20 потоков TWorker.
Когда босс создает экземпляр TWorker, он назначает ему метод для вызова синхронизации, когда 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 - это то, что получаетзапустить на Синхронизировать (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;