delphi – 一种破坏TThread对象的正确方式

delphi – 一种破坏TThread对象的正确方式,第1张

概述这个问题可能很简单,但我希望你不要忽视它. 在销毁TThread对象之前,通常需要等待直到调用TThread.Execute()方法的线程完成,因为只有这样我们才能确定,例如,类的析构函数中销毁的对象不再被访问.因此,有必要调用Terminate设置线程必须检查的Terminated标志,以确定是否退出,然后调用WaitFor()方法. 因为线程可能被暂停,我认为在调用WaitFor之前恢复它是好 这个问题可能很简单,但我希望你不要忽视它.
在销毁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),而不关心是否被破坏对象是否为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对象.我问这个问题,我从我的同事的代码中学到,他们通常使用第一个代码来破坏这些对象,但是他们从来没有用来检查是否等待的线程被暂停,我认为线程有点危险可能会暂停在代码中的某个地方.因此,我试图找到一种普遍的方法来摧毁这个类的对象,这将使代码更加清晰和安全.我希望我没有变得更糟 – 你觉得怎么样?

感谢您的建议.

解决方法 你的建议在TThread.Destroy析构函数中已经执行了很多,调用TMyThread.free就可以做到你的建议.要清除线程类所拥有的任何对象,您可以在OnTerminate事件中执行,这将作为线程关闭逻辑的一部分被调用. 总结

以上是内存溢出为你收集整理的delphi – 一种破坏TThread对象的正确方式全部内容,希望文章能够帮你解决delphi – 一种破坏TThread对象的正确方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1277835.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存