Приложение написано на Delphi XE.
У меня есть два класса, TBoss и TWorker, которые основаны на TThread. TBoss - это поток с одним экземпляром, который запускается, а затем создает около 20 потоков TWorker.
Когда босс создает экземпляр TWorker, он назначает ему метод для вызова синхронизации, когда Worker закончил с тем, что он делает. он вызывает этот метод, который позволяет боссу получить доступ к записи в Worker.
Однако я считаю, что это проблема, вызов synchronize, похоже, блокирует все приложение - блокирует основной (ui) поток. На самом деле нужно просто синхронизировать этого рабочего с потоком босса ....
Раньше я использовал сообщения / упакованные записи для отправки контента между потоками, что хорошо работало. Однако делать это таким образом намного чище и приятнее .... просто очень блокирует.
Есть ли способ вызвать 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;