这个问题可能看起来微不足道,但我希望你不要忽视它。
在销毁 TThread 对象之前,通常需要等到调用 TThread.Execute() 方法的线程完成,因为只有这样我们才能确定,例如,在类的析构函数中销毁的对象不再被访问。因此需要调用 Terminate 来设置线程必须检查是否退出的 Terminated 标志,然后调用 WaitFor() 方法。
因为线程可能被挂起,我认为在调用WaitFor之前恢复它比较好,否则调用线程会死锁。而且因为线程可以被挂起多次,它应该被恢复相同的次数,对吧?
while Suspended do
Resume;
如果创建的线程是挂起的,我们不必担心当我们恢复线程只是为了终止它时会调用 TThread.Execute() 方法——它不会(如果我错了,请纠正我)。
我所说的建议对每个被释放的 TThread 对象使用以下代码行:
MyThread.Terminate;
while MyThread.Suspended do
MyThread.Resume;
MyThread.WaitFor;
MyThread.Free;
不幸的是,当我们销毁创建了多个线程的应用程序时,为每个被销毁的 TThread 对象编写这样一段代码会不必要地使代码变得很长,甚至可能不透明。
因此,我得出一个结论,所有这些都可以放在 TThread 类的重写析构函数中,这足以调用 MyThread.Free (如果设置了 MyThread.FreeOnTerminate 则调用 MyThread.Terminate )而不关心是否被破坏object 是否为 TThread 对象:
destructor TMyThread.Destroy;
begin
//if FreeOnTerminate, the calling thread cannot wait for itself
if GetCurrentThreadId <> ThreadId then
begin
Terminate;
while Suspended do
Resume;
WaitFor;
end;
{free all objects created in this class}
inherited Destroy;
end;
请原谅我问了这么一个基本的问题。但是,我想了解您对这种销毁 TThread 对象的方式(我希望是一种通用方式)的看法。我问这个问题是因为我从同事的代码中了解到,他们通常使用第一个代码示例来销毁此类对象,但他们从未使用过检查正在等待的线程是否没有被挂起,如果线程我认为有点危险可能会暂停在代码中的某处。因此,我试图找到一种销毁此类对象的通用方法,这将使代码更清晰、更安全。我希望我没有让事情变得更糟——你怎么看?
提前感谢您的建议。