这个问题可能看起来微不足道,但我希望你不会忽视它。
在销毁TThread对象之前,通常需要等到调用TThread.Execute()方法的线程完成后,才可以确保例如在类的析构函数内销毁的对象不再被访问。因此,有必要调用Terminate来设置线程必须检查的终止标志以确定是否退出,然后调用WaitFor()方法。
摧毁TThread对象的正确方法
因为线程可能被挂起,所以我认为在调用WaitFor之前恢复它是件好事,否则调用线程会死锁。而且因为线程可以被多次挂起,所以它应该恢复相同的次数,对吧?
while Suspended do
Resume;
如果线程创建挂起,我们不必担心,当我们恢复该线程只终止它的TThread.Execute()方法将被调用 - 它不会(请纠正我,如果我错了)。
什么,我说建议使用下面的代码行对每个对象的TThread被释放:
MyThread.Terminate;
while MyThread.Suspended do
MyThread.Resume;
MyThread.WaitFor;
MyThread.Free;
不幸的是,当我们破坏已创建多个线程,写下了这样一段代码为我们的应用程序每个TThread对象被不必要地销毁会使代码非常长,甚至可能不透明。
因此我得出的结论是,所有这些都可以放在TThread类的overriden析构函数中,因为如果不关心,调用MyThread.Free(或MyThread.Terminate,如果MyThread.FreeOnTerminate设置)就足够了关于被破坏的物体是否是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对象。我问这个问题,我从我的同事们的代码中学到,他们通常使用第一个代码示例销毁这些对象,但他们从来没有用来检查被等待的线程是否被暂停,如果线程被认为有点危险可能会在代码中的某处暂停。所以我试图找到一种通用的方法来销毁这个类的对象,这会使代码更清晰和更安全。我希望我没有让事情变得更糟 - 你怎么看?
感谢您的建议提前。
从哈姆雷特的主波洛尼斯的话提醒:简洁是机智的灵魂 – Argalatyr 2009-07-07 00:39:26