【发布时间】:2016-03-14 23:44:10
【问题描述】:
很久以前,当我开始在 Delphi 中使用线程时,我通过在构造函数末尾调用 TThread.Resume 来让线程自己启动,现在仍然这样做:
constructor TMyThread.Create(const ASomeParam: String);
begin
inherited Create(True);
try
FSomeParam:= ASomeParam;
//Initialize some stuff here...
finally
Resume;
end;
end;
从那时起,Resume 已被弃用,取而代之的是使用 Start。但是Start只能从线程外调用,不能从构造函数内调用。
我继续使用Resume 设计我的线程,如上所示,虽然我知道它已被弃用 - 只是因为我不想从线程外部调用Start。我觉得不得不打电话有点乱:
FMyThread := TMyThread.Create(SomeParamValue);
FMyThread.Start;
问题:进行此更改的原因是什么?我的意思是,使用 Resume 有什么问题,以至于他们希望我们改用 Start?
编辑 在 Sedat 的回答之后,我想这真的取决于在构造函数中线程何时真正开始执行。
【问题讨论】:
-
finally 是错误的。如果引发异常怎么办?
-
不管你做什么,最后总是错的。不要在析构函数即将运行的部分构造对象上执行线程。
-
关于做什么:1. 删除 try/finally,2. 删除对 Resume 的调用,3. 将 False 传递给继承的构造函数。 4.让
TThread.AfterConstruction在所有构造函数,甚至派生构造函数都完成后启动线程。 -
查看源代码是如何实现的总是一个明智的决定。当前实现还尊重 Windows 2003 Server 在
CreateThread调用中启动线程的不同行为 -
@SirRufo 我认为您可能错误地阅读了文档。在所有版本的window中,如果
CREATE_SUSPENDED没有被传递,那么线程可能会在CreateThread返回之前开始执行。 Windows Server 2003 的特定行为在文档的上一段中进行了描述,并且与令牌和模拟有关。
标签: multithreading delphi deprecated tthread