multithreading - TidThreadComponent 的 Loop 属性
问题描述
我有一个(希望如此)简单的问题:
Loop
属性的含义是TidThreadComponent
什么?
我的线程程序在 Delphi 7 中编译时运行良好,但在 Delphi Embarcadero 下编译时线程工作不可预测。我怀疑 Loop
的属性TidThreadComponent
(在 Delphi 7 中不记得了)。
名字Loop
说Loop=true
应该让他的线程在循环中开始,直到手动终止。然而,观察到其他东西。
提前感谢您的任何想法。
解决方案
根据 的文档TIdThread
,其中TIdThreadComponent
包含:
Loop 是一个布尔属性,用于指示是否在循环中调用线程实例的 Run 方法。
当 Loop 包含 True(在 Create 中分配的默认值)时,Run 方法将不断执行,直到 Stopped 返回 True。
当 Loop 包含 False 时,在线程执行期间调用一次 Run 方法。
你问是否Loop=true
应该让线程“在循环中开始,直到手动终止”,但更准确的说法是线程的Run()
方法是循环的,直到线程停止,而不是终止。Indy 中的两个不同概念。线程可以在不被终止的情况下停止,这允许线程重新启动。例如,当使用TIdSchedulerOfThreadPool
.
当 aTIdThread
被停止时,它会停止调用它的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;
因此,它基本上归结为控制在and之间调用Loop
多少次,仅此而已。尽管如此,线程仍将继续调用,直到线程停止或终止。Run()
BeforeRun()
AfterRun()
Run()
推荐阅读
- python - python - 使用 csv 复制标题行并修改文件
- scala - Spark:从数据框中的电子邮件地址中提取域
- facebook - Facebook Graph API v2.11+ - '/business_id/pages' 不返回业务经理下的关联页面
- java - 无法单击 Appium 中 LinearLayout 下存在的元素
- ruby-on-rails - Active Record Query 不会加载所有的 id
- powerbi - 迄今为止的月份公式在 Power Bi 上无法正常工作
- sql - sql日期差异查询
- javascript - d3js nice() 没有四舍五入轴域
- python - 如何通过 Python 将数据帧作为 csv 上传到 azure?
- go - 理解字符串转义序列