【问题标题】:In a Delphi thread's, when the memory is freed?在 Delphi 线程中,何时释放内存?
【发布时间】:2013-07-30 17:09:13
【问题描述】:

一个线程已经分配了

FreeOnTerminate := true;

我知道它的内存会在它终止时被释放,但是 Terminate 事件什么时候会发生呢?

或者,以更通用的方式,与某个线程相关的内存何时释放?

【问题讨论】:

  • 没有Terminate 事件。所有你需要知道的都可以在名为ThreadProc函数的过程中找到,该函数可以在Classes中找到。

标签: multithreading delphi delphi-7


【解决方案1】:

线程本身的内存在线程被释放时被释放(IOW,当它的析构函数退出时)。 FreeOnTerminate 只是表示当线程被终止(Execute 方法退出)时,会自动调用析构函数。

线程分配给自己使用的任何内存都应该由线程在其析构函数中释放。

【讨论】:

  • @DavidHeffernan: AFAIR,TThread.Terminate 是一个标志属性(execute 方法可以忽略或服从)指示线程必须NOW完成它的工作。跨度>
  • @DavidHeffernan:FTerminated (IIRC) 标志已通过调用TThread.Terminate 设置。和肯:那个“或”应该是一个“和”。或者实际上整个终止的东西可以在那里删除。执行方法可以忽略终止标志,并且执行方法可以在不调用 Terminate 的情况下终止。
  • @MarjanVenema:由于Execute 可以在不设置标志的情况下退出,所以or 不是更合适(Terminate 标志已设置,Execute 对其进行检查并退出,OR Execute 函数在没有设置 Terminate 的情况下完成)? (再想一想,如果Execute 不检查它,Terminate 本身不会做任何事情,所以你是对的。我会编辑。谢谢。)
  • @DavidHeffernan:“已设置终止”具有设置布尔标志的典型含义:该值已设置为 True。 (我已经删掉了那句话,因为 Marjan 正确地认为它对答案是不必要的。)
  • 终止是一种方法,不是布尔标志
【解决方案2】:

FreeOnTerminate 为真时,TThread 在调用并退出TThread.DoTerminate() 之后,在调用并退出TThread.Execute() 之后释放自己的内存(调用自己的析构函数)。所以基本上,一旦DoTerminate() 被调用(如果被分配,它会在内部触发TThread.OnTerminate 事件)并退出,假设你的TThread 对象在FreeOnTerminate 为真时不再有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多