Свойство Loop объекта TidThreadComponent - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть (надеюсь) простой вопрос:

Что означает Loop свойство TidThreadComponent?

Моя программа с потоками работает хорошо при компиляции в Delphi 7, но потоки работают непредсказуемо при компиляции в Delphi Embarcadero.Я подозреваю, что Loop свойство TidThreadComponent (не помню это в Delphi 7).

Имя Loop говорит о том, что Loop=true должен заставить поток запускаться в цикле, пока не завершится вручную.Однако что-то еще наблюдается.

Заранее спасибо за любую идею.

1 Ответ

2 голосов
/ 25 сентября 2019

Согласно документации TIdThread, которая TIdThreadComponent оборачивает:

Loop - это логическое свойство, используемое для указания, вызывается ли метод Run для экземпляра потока в цикле.

Когда Loop содержит True (значение по умолчанию, назначенное в Create), метод Run будет выполняться непрерывно, пока Stopped не вернет True.

Когда Loop содержит False, метод Run вызывается один раз во время выполнения потока.

Вы спрашиваете, должен ли Loop=true запускать поток "в цикле, пока не завершится вручнуюmsgstr ", но точнее сказать, что метод потока Run() зацикливается до тех пор, пока поток не будет остановлен , а не завершен .Два разных понятия в Инди.Поток может быть остановлен без остановки , что позволяет перезапустить поток.Например, при использовании TIdSchedulerOfThreadPool.

Когда TIdThread равен остановлен , он прекращает вызывать свой метод Run() и затем либо сам Terminate(), либо Suspend(),в зависимости от его свойства StopMode.По умолчанию smTerminate.

TIdThreadComponent выполняет внутренний TIdThread/Ex, который получен из TThread.Как и в большинстве случаев использования потоков Delphi, метод потока Execute() выполняет цикл while not Terminated.Внутри этого цикла Terminated свойство потока Loop определяет, вызывается ли метод потока Run() один раз за итерацию цикла или вызывается в своем собственном цикле while not Stopped за итерацию.Другими словами, есть разница между этим:

while not Terminated do
begin
  if Stopped then
  begin
    if Terminated then Break;
    Suspend;
    if Terminated then Break;
  end;
  BeforeRun;
  Run; // <-- Loop=false
  AfterRun;
end;

И этим:

while not Terminated do
begin
  if Stopped then
  begin
    if Terminated then Break;
    Suspend;
    if Terminated then Break;
  end;
  BeforeRun;
  while not Stopped do Run; // <-- Loop=true
  AfterRun;
end;

Итак, что в основном сводится к тому, что Loop контролирует сколько разRun() вызывается между BeforeRun() и AfterRun(), не более того.Тем не менее, поток будет продолжать вызывать Run(), пока поток не будет остановлен или завершен .

...