Как правильно запустить приостановленный поток в Delphi 2007? - PullRequest
8 голосов
/ 17 ноября 2010

в Delphi XE я могу использовать процедуру запуска, но этот метод не существует в Delphi 2007.

этот пример кода работает нормально в Delphi XE, используя Start

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminate    :=True;
MyThread.Property1:=900;
MyThread.Property2:=2;
MyThread.Start;

но в delphi 2007 процедура start не существует, поэтому я использую процедуру возобновления, которая устарела в новых версиях delphi.

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminate    :=True;
MyThread.Property1:=900;
MyThread.Property2:=2;
MyThread.Resume;

Таким образом, quieon, все в порядке, используйте resume в Delphi 2007 или я должен использовать другой способ для запуска приостановленного потока?

Заранее спасибо.

Ответы [ 5 ]

21 голосов
/ 17 ноября 2010

Правильный способ запустить приостановленную нить - никогда не иметь приостановленной нити.

Есть лучший способ создавать темы. Если вызывающая сторона должна предоставить значение для объекта, чтобы класс работал правильно, не делайте его необязательным: укажите его как параметр для конструктора. И если для этого параметра есть только одно допустимое значение, то даже не делайте его параметром: просто жестко закодируйте его в конструкторе. (Сколько раз вы писали класс потока, который только иногда должен освободиться после завершения? Я никогда не видел этого.)

constructor TMyThread.Create(Prop1, Prop2: Integer);
begin
  inherited Create(False);
  FreeOnTerminate := True;
  Property1 := Prop1;
  Property2 := Prop2;
end;

Тогда вы можете использовать метод создания потоков Рона Попейла: Просто установите его и забудьте об этом!

MyThread := TMyThread.Create(900, 2);

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

(Обеспокоенный тем, что строка inherited Create(False) создает поток, который начнет работать до завершения работы остальной части конструктора? Не надо! Это было исправлено в Delphi 6 более десяти лет назад. Поток автоматически запустится сам после завершения конструктора; см. TThread.AfterConstruction, чтобы увидеть как.)

5 голосов
/ 18 ноября 2010

Нет ничего плохого в вызове Resume для потока, который был создан с параметром CreateSuspended, установленным в true в конструкторе. (Почему в противном случае будет параметр CreateSuspended?)

Однако настоящая проблема возникает, когда вы приостанавливаете / возобновляете работающий поток . В основном это связано с ссылками на открытые ресурсы, такие как COM-объекты. (Например, если у вас активен объект подключения ADO и запущен запрос ... не очень идеально приостанавливать этот поток и пытаться возобновить его позже ... это, очевидно, просто не всегда будет работать хорошо для вас или подключение к базе данных в этом сценарии.)

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

1 голос
/ 17 ноября 2010

Resume и Suspend устарели в Delphi 2010 и более новых версиях.Кажется, это в основном не рекомендуется использовать их для синхронизации потоков.Они не предназначены для этого.

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

Если вам нужно использовать то же самоеИсходный код в Delphi 2007 и Delphi XE, то вы можете использовать условную компиляцию, чтобы избежать предупреждения в XE.

Кроме того, взгляните на этот вопрос, который связан с вашим вопросом:

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

1 голос
/ 17 ноября 2010

Да, это правильный путь для более старых версий Delphi, в которых нет процедуры Start.

0 голосов
/ 18 ноября 2010

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

В Delphi 2010 приостановка и возобновление, где амортизировались, и запуск метода были введены, чтобы усилить это.

Более полное объяснение см. В этой теме на форумах Codegears.

...