Приложение написано на Delphi XE.Синхронизация/отправка данных между потоками
У меня есть два класса: TBoss и TWorker, которые основаны на TThread. TBoss - это поток одного экземпляра, который запускается, а затем создает около 20 потоков TWorker.
Когда босс создает экземпляр TWorker, он назначает ему метод вызова синхронизации, когда рабочий закончил с тем, что он делает, и вызывает этот метод, который позволяет Боссу получить доступ к записи на Рабочем месте.
Однако я чувствую, что это проблема, вызывающая синхронизация, по-видимому, блокирует все приложение - блокирует поток main (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 - это то, что можно работать на Синхронизировать (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
Delphi XE - спасибо – Wizzard
Я бы сказал, что использование сообщений для передачи данных между потоками, которое не требует «механизма синхронизации приложений» (оно находится в потоковой «структуре»), гораздо более элегантно, чем использование примитивов синхронизации вокруг общих данных. – Misha