TThread.resume устарел в Delphi-2010, что следует использовать вместо него?

StackOverflow https://stackoverflow.com/questions/1418333

  •  07-07-2019
  •  | 
  •  

Вопрос

В моем многопоточном приложении

я использую TThread.suspend и TThread.resume

После переноса моего приложения на Delphi 2010 я получаю следующее неприятное сообщение:

[Предупреждение DCC] xxx.pas(277):Символ W1000 «Возобновление» устарел.

Если резюме устарело, что следует использовать вместо него?

РЕДАКТИРОВАТЬ 1:

Я использую Резюме команда для запуска потока - поскольку он создан с параметром CreateSuspended, установленным в True и Приостановить прежде чем я закрою ветку.

РЕДАКТИРОВАТЬ 2:

Вот ссылка на руководство Delphi 2010.

Это было полезно?

Решение

Чарльз, если ты прочитаешь код класса TThread, ты найдешь ответ.

   TThread = class  
   private type  

..
..
..   
   public  
     constructor Create(CreateSuspended: Boolean);  
     destructor Destroy; override;  
     procedure AfterConstruction; override;  
     // This function is not intended to be used for thread synchronization.  
     procedure Resume; deprecated;  
     // Use Start after creating a suspended thread.  
     procedure Start;  
     // This function is not intended to be used for thread synchronization.  
     procedure Suspend; deprecated;  
     procedure Terminate;  

См. эту ссылкуhttp://wings-of-wind.com/2009/08/28/rad-studio-2010-community-pulse-the-day-after-part-2/

Редактировать:

Если вам нужно синхронизировать потоки, вы можете использовать схему на основе TMutex, TEvent и критических секций.

Пока.

Другие советы

Используйте TThread.Start вместо .Resume

--РЕДАКТИРОВАТЬ-- Конечно, Start можно использовать только в Delphi 2010 (и, предположительно, более поздних версиях) для запуска потока, который был создан приостановленным (в то время как раньше вы использовали Resume).

Использование Resume/Suspend (или соответствующих функций WinAPI) для синхронизации потоков НЕ рекомендуется.Посмотреть обсуждение здесь (посмотрите комментарии Барри Келли).

Suspend и Resume были (или были) потенциально повреждены в классе TThread (если вы посмотрите на источник, то увидите что метод Suspend напрямую и безоговорочно устанавливает логическое значение для указанного приостановленного состояния потока, а не более надежно выводит это состояние из счетчика выполнения на дескрипторе потока. По иронии судьбы метод Resume использует этот более надежный индикатор для < em> update логическое состояние приостановки).

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

Я не уверен, почему их устаревание предположительно связано с синхронизацией. Приостановка и возобновление потоков не обязательно связаны с синхронизацией, хотя я вижу, как это может быть. Интересно отметить, что эквивалентные методы в классе Thread платформы .NET аналогично помечаются как устаревшие. И те же комментарии с синхронизацией w.r.t появляются в документации по API Windows для приостановки / возобновления потока.

Если использование устаревших методов заставляет вас нервничать и вы все еще хотите приостановить / возобновить работу, вы всегда можете использовать Windows API для приостановить и возобновить поток, ссылаясь на его дескриптор .

Код управления поведением потока должен лежать в процедуре потока. Используйте соответствующие объекты синхронизации и соответствующие вызовы API для приостановки / возобновления выполнения потока. Делать это извне - опасная практика. Так что было принято решение об его исключении.

На всякий случай все, что вам хотелось сделать, это избавиться от подсказок компилятора.

(1) Чтобы избавиться от подсказки компилятора, когда Начало темы ...

заменять

MyThread := TMyThread.Create(True);
MyThread.Resume;

с

MyThread := TMyThread.Create(True);
MyThread.Start;

(2) Чтобы избавиться от подсказки компилятора, когда Остановка потока ...

заменять

MyThread.Suspend;
MyThread.Terminate;

с

MyThread.Terminate;

Ничего страшного.Остерегаться попытка запутывания.

Вы должны создать поток следующим образом:

constructor TSignalThread.Create;
begin
 // create event handle first!
  FEventHandle := CreateEvent(
          {security}      nil,
          {bManualReset}  true,
          {bInitialState} false,
          {name}          nil);
  FWaitTime := 10;
  inherited Create({CreateSuspended}false);
end;

Таким образом, вызов Start не требуется.

См. http://www.gerixsoft.com/blog/delphi/creating- темы для объяснения, почему этот код работает.

Использовать

Suspended := False; // Resume;

или

Start;

@mghie (немного поздно, я знаю)

возьмите, например, madexcept и тому подобное. Если ваше приложение дает сбой и пользователю показывается отчет об ошибке, это означает, что диалоговое окно ожидает ввода от пользователя. Если случится так, что сбой является результатом действия потока (не обязательно сбоя потока), если вы не приостановите потоки, экран будет заполнен диалоговыми окнами отчетов об ошибках.

пример 2: ведение журнала. по какой-то конкретной причине, по крайней мере, у меня возникла необходимость регистрировать состояние выполнения некоторых потоков. Это включает текущую трассировку стека. Теперь, как вы (должны) знать, вы не можете сделать это во время работы потока, потому что в течение времени, когда вы собираете информацию о нем, потоки продолжают делать вещи, поэтому к тому времени, когда вы закончите сбор, собранная информация не будет согласованной. Следовательно, вам нужно приостановить поток.

И я могу продолжить с практическими примерами по управлению потоками. Конечно, это не вещи, которые вы делаете в повседневном программировании, но, по крайней мере, первый пример, который, я уверен, многие из вас используют, даже если вы не знаете о его внутренностях. Debuggers? опять же вы их используете. Но действительно, во всех этих случаях TThread не используется, так как работа выполняется над дескрипторами потоков. Таким образом, действительно, трудно найти действительный пример использования приостановки TThread. Но темы вообще, это другая история.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top