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;

    通过!折腾!

  • 相关阅读:
    使用定时器实现获取手机验证码倒计时
    搜索历史管理
    利用vue和jQuery实现中国主要城市搜索与选择
    使用vue、jQuery生成带有logo的二维码
    使用vue-cli脚手架搭建Vue项目
    postcss-px-to-viewport
    git命令操作篇
    小程序中live-player
    对于常用数组的方法总结
    css的加载中动画
  • 原文地址:https://www.cnblogs.com/zhenfei/p/4059646.html
Copyright © 2011-2022 走看看