Этот вопрос касается того, что 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, если он приостановлен.