Этот вопрос касается Delphi и XE, в частности, осуждающих Suspend и Resume.Я читал другие посты и пока не нашел аналогичного использования, поэтому я собираюсь пойти дальше и попросить обсудить.
Что я хотел бы знать, так это лучший способ сделать паузупоток, когда он не нужен?
У нас есть класс 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, если он приостановлен.