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怎么看.)
在构造函数中将CreateSuspended参数设置为true创建的线程上调用Resume没有任何问题.(为什么还有一个CreateSuspended参数?)
但是,当您暂停/恢复正在运行的线程时,会出现真正的麻烦.主要是因为引用了开放资源,例如COM对象.(例如,如果你有一个ADO连接对象处于活动状态,并且正在运行一个查询......暂停该线程并尝试稍后恢复它并不是很理想...显然并不总是能够很好地为你做好准备该场景中的数据库连接.)
如果你小心使用外部引用,那么暂停/恢复正在运行的线程会变得更加安全,除了可能出现的竞争条件......但这些是许多其他问题的答案......