Самостоятельная приостановка потока в Delphi, когда он не нужен, и безопасное возобновление

Этот вопрос касается того, что Delphi и XE не рекомендуют приостановку и возобновление. Я прочитал другие сообщения и пока не нашел аналогичного использования, поэтому я собираюсь пойти дальше и попросить обсудить.

Я бы хотел знать, есть ли лучший способ приостановить обсуждение, когда он не нужен?

У нас есть класс Delphi, который мы использовали в течение многих лет, который в основном представляет собой очередь FIFO, связанную с многопоточным процессом. Очередь принимает объект данных в основном потоке, и если поток приостановлен, он возобновит его.

Как часть процесса выполнения потока, объект извлекается из очереди и обрабатывается в потоке. Обычно это делается для поиска в базе данных.

В конце процесса свойство объекта обновляется и помечается как доступное для основного потока или передается в другую очередь. Последний (ну, на самом деле это первый) шаг процесса Execute - проверить, есть ли еще элементы в очереди. Если есть, оно продолжается, в противном случае оно приостанавливается.

Их ключ - единственное действие приостановки, которое происходит внутри цикла «Выполнение», когда оно завершено, и единственное возобновление во время обычных операций вызывается, когда новый элемент помещается в очередь. Исключение составляют случаи, когда класс очереди завершается.

Функция возобновления выглядит примерно так.

process TthrdQueue.MyResume();
  begin
    if Suspended then begin
      Sleep(1); //Allow thread to suspend if it is in the process of suspending
      Resume();
    end;
  end;

Выполнение выглядит примерно так.

process TthrdQueue.Execute();
  var
    Obj : TMyObject;
  begin
    inherited;
    FreeOnTerminate := true;
    while not terminated do begin
      if not Queue.Empty then begin
        Obj :=  Pop();
        MyProcess(Obj);  //Do work
        Obj.Ready := true;
      end
      else
        Suspend();  // No more Work
    end;   //Queue clean up in Destructor
  end;  

Процедура TthrdQueue Push вызывает MyResume после добавления другого объекта в стек. MyResume вызывает Resume только в том случае, если поток приостановлен.

При завершении работы мы устанавливаем для terminate значение true и вызываем MyResume, если он приостановлен.

6
задан Rich Shealer 9 December 2010 в 17:19
поделиться

0 ответов

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

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