在delphi 2007中启动挂起线程的正确方法是什么?

Sal*_*dor 9 delphi multithreading delphi-2007

在delphi XE中我可以使用启动过程,但这种方法在delphi 2007中不存在.

这个示例代码在delphi xe中运行正常,使用Start

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminate    :=True;
MyThread.Property1:=900;
MyThread.Property2:=2;
MyThread.Start;
Run Code Online (Sandbox Code Playgroud)

但是在delphi 2007中,该start过程不存在,所以我使用的是在新版本的delphi中不推荐使用的简历过程.

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminate    :=True;
MyThread.Property1:=900;
MyThread.Property2:=2;
MyThread.Resume;
Run Code Online (Sandbox Code Playgroud)

所以quieon是,resume在delphi 2007中可以使用,或者我必须使用另一种方式来启动一个被挂起的线程?

提前致谢.

Rob*_*edy 21

启动挂起线程的正确方法是首先不要有挂起的线程.

有一种更好的方法来创建线程.如果调用者必须为对象提供值以使类正常工作,那么不要使其成为可选:要求它作为构造函数的参数.如果该参数只有一个有效值,那么甚至不要将它作为参数:只需在构造函数中对其进行硬编码即可.(你有多少次写过一个线程类,有时只能在终止时释放自己?我从来没有见过.)

constructor TMyThread.Create(Prop1, Prop2: Integer);
begin
  inherited Create(False);
  FreeOnTerminate := True;
  Property1 := Prop1;
  Property2 := Prop2;
end;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用Ron Popeil创建线程的方法:只需设置并忘记它!

MyThread := TMyThread.Create(900, 2);
Run Code Online (Sandbox Code Playgroud)

调用者在创建线程后不必对该线程执行任何操作.由于它是一个免费终止的线程,调用者甚至可能根本不应该保留对该MyThread变量的引用,因为一旦线程完成运行,引用将变为无效.

(担心该inherited Create(False)行创建一个线程,它将在构造函数的其余部分完成运行之前开始运行?不要!这已经在十年前的Delphi 6中修复了.线程将在构造函数完成后自动启动;看TThread.AfterConstruction怎么看.)


Dar*_*ler 5

在构造函数中将CreateSuspended参数设置为true创建的线程上调用Resume没有任何问题.(为什么还有一个CreateSuspended参数?)

但是,当您暂停/恢复正在运行的线程时,会出现真正的麻烦.主要是因为引用了开放资源,例如COM对象.(例如,如果你有一个ADO连接对象处于活动状态,并且正在运行一个查询......暂停该线程并尝试稍后恢复它并不是很理想...显然并不总是能够很好地为你做好准备该场景中的数据库连接.)

如果你小心使用外部引用,那么暂停/恢复正在运行的线程会变得更加安全,除了可能出现的竞争条件......但这些是许多其他问题的答案......