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;

    通过!折腾!

  • 相关阅读:
    python装饰器
    python名称空间和作用域
    python函数-函数对象
    python函数-参数
    python文件高级操作
    python基本文件操作
    python2和3的区别
    OSI-传输层
    Android屏幕density, dip等相关概念总结
    架构设计:系统间通信(20)——MQ:消息协议(下)
  • 原文地址:https://www.cnblogs.com/zhenfei/p/4059646.html
Copyright © 2011-2022 走看看