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

Это - определенно лучший способ для любого массива, длина которого является целочисленным типом со знаком. Для массивов, длины которых являются неподписанным целочисленным типом (например, std::vector в C++), тогда необходимо изменить условие конца немного:

for(size_t i = myArray.size() - 1; i != (size_t)-1; i--)
    // blah

, Если Вы просто сказали i >= 0, это всегда верно для целого числа без знака, таким образом, цикл будет бесконечным циклом.

35
задан Charles Faiga 19 September 2009 в 09:18
поделиться

5 ответов

Чарльз, если вы читаете код класса 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 и критических секций.

Пока.

28
ответ дан 27 November 2019 в 07:03
поделиться

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

- EDIT-- Разумеется, запуск можно использовать только с Delphi 2010 (и, предположительно, более поздней версии) для запуска потока, который был создан приостановленным (где раньше вы использовали Resume).

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

13
ответ дан 27 November 2019 в 07:03
поделиться

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

4
ответ дан 27 November 2019 в 07:03
поделиться

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

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

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

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

NET framework Thread также помечены как устаревшие. И те же комментарии относительно синхронизации появляются в документации Windows API для приостановки / возобновления потоков.

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

NET framework Thread также помечены как устаревшие. И те же комментарии относительно синхронизации появляются в документации Windows API для приостановки / возобновления потока.

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

7
ответ дан 27 November 2019 в 07:03
поделиться

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

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-threads для объяснения, почему этот код работает.

3
ответ дан 27 November 2019 в 07:03
поделиться
Другие вопросы по тегам:

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