zoukankan      html  css  js  c++  java
  • FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题

    这个问题折腾了我整整一天。 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 FreeOnTerminate 为 True。 因为有的线程是不限次循环的,所以在管理类最后 Destroy 时必须对这些线程进行手工停止并释放。

    开始代码:

    FAllThread.Items[i].FOwner := nil; //释放时不必再消息通知管理类删除记录
    FAllThread.Items[i].Terminate;

    发现 FastMM检测有内存泄露,想了下因为线程还没结束,但主进程结束了,所以被检测泄露实属正常。于是增加了一句:

    FAllThread.Items[i].Waitfor;  希望等线程释放了再继续

    结果报错:无效句柄!....   什么情况

    跟踪源码,一直到执行调用windows API 的 ExitThread,无法再跟入,报错! 

    思前想后,无效句柄,应该是在使用句柄时句柄已经不存在, 最后聚焦到 FreeOnTerminate  属性,不管内部Delphi 的bug 也好,大多与线程释放有关。 

    最后代码: 

    FAllThread.Items[i].FOwner := nil; //释放时不必再消息通知管理类删除记录
    FAllThread.Items[i].FreeOnTerminate := False; // .Terminate;
    FAllThread.Items[i].Free;

    通过!折腾!

  • 相关阅读:
    AtCoder ABC 129F Takahashi's Basics in Education and Learning
    AtCoder ABC 129E Sum Equals Xor
    UVA 511 Do You Know the Way to San Jose?
    UVA 12504 Updating a Dictionary
    [Poi2000] 病毒
    [loj10061] 最短母串
    [Poi2010] Antisymmetry
    校内集训20181003
    校内集训20181001
    校内集训20180925
  • 原文地址:https://www.cnblogs.com/zhenfei/p/4059646.html
Copyright © 2011-2022 走看看