• 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;

    通过!折腾!

  • 相关阅读:
    DevExpress.XtraScheduler控件的使用方法
    读写Excel文档
    让程序以管理员身份运行
    读写TXT文档
    判断程序是自动启动还是用户启动
    用指针读BMP图像
    判断网络是否连接通
    WSL初体验
    Realsense内参标定
    FreeSwitch权威指南
  • 原文地址:https://www.cnblogs.com/zhenfei/p/4059646.html
Copyright © 2020-2023  润新知