Согласно документации 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()
, пока поток не будет остановлен или завершен .