У меня (надеюсь) простой вопрос:
В чем смысл Loop
свойство TidThreadComponent
?
Моя программа с нитками работает хорошо, когда скомпилирована в Delphi 7, но потоки работают непредсказуемыми при компиляции в Delphi Embarcadero. Я подозреваю, как свойство Loop
TidThreadComponent
(не помните его в Delphi 7).
Название Loop
говорит, что Loop=true
должен сделать резьбу начать в цикле, пока не завершится вручную. Тем не менее, что-то еще наблюдается.
Заранее спасибо за любую идею.
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()
, тем не менее, пока нить не будет ни не остановлена или завершилась.
Похожие вопросы
Новые вопросы
multithreading
Для вопросов, касающихся многопоточности, способность компьютера или программы выполнять работу одновременно или асинхронно, используя несколько одновременных потоков выполнения (обычно называемых потоками).