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

В чем смысл Loop свойство TidThreadComponent?

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

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

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

0
Spectorsky 25 Сен 2019 в 13:42

1 ответ

Лучший ответ

На документацию TIdThread, которые TIdThreadComponent обертываются:

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

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

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

Вы спрашиваете, если Loop=true должен сделать резьбу «начать в цикле до завершения вручную», но более точнее сказать, что метод {{{Run() зацикливается до того, как нить не будет , не заканчивается . Две разные концепции в Indy. Нить может быть остановлена без того, чтобы быть завершиться , это позволяет потоку перезапустить. Например, при использовании TIdSchedulerOfThreadPool.

Когда TIdThread - это остановило , он останавливается вызова его метода {Run() и будет либо Terminate(), либо Suspend(), либо Suspend(), в зависимости от его {{x4 }} имущество. По умолчанию smTerminate.

TIdThreadComponent запускает внутренний TIdThread/Ex, который получен из TThread. И, как и большинство используемых потоков Delphi, метод {{x3} 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(), а AfterRun(), и не более. Нить будет продолжать вызов Run(), тем не менее, пока нить не будет ни не остановлена или завершилась.

2
Remy Lebeau 25 Сен 2019 в 17:14