Синхронизация / отправка данных между потоками

Приложение написано на 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;
12
задан bummi 2 January 2015 в 09:03
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: