这个问题折腾了我整整一天。 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 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;

通过!折腾!

FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题的更多相关文章

  1. 线程池的管理类MyThreadPoolManager

    import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executor; import java.ut ...

  2. Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类

    Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...

  3. .NET组件程序设计之线程、并发管理(二)

    .Net组件程序设计之线程.并发管理(二) 2.同步线程 手动同步 监视器 互斥 可等待事件 同步线程 所有的.NET组件都支持在多线程的环境中运行,可以被多个线程并发访问,如果没有线程同步,这样的后 ...

  4. .Net组件程序设计之线程、并发管理(一)

    .Net组件程序设计之线程.并发管理(一) 1.线程 线程 线程的创建 线程的阻塞 线程挂起 线程睡眠 加入线程 线程中止 现在几乎所有的应用程序都是多线程的,给用户看来就是一个应用程序界面(应用程序 ...

  5. 线程池之ThreadPool类与辅助线程 - <第二篇>

    一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线程反复利用(线程池初始化时没有线程,有程序请求线程则创建线程): 最好不要销毁而是挂起线程达到避免性能损失(线程池创建的线程完成任 ...

  6. ExecutorService实际上是一个线程池的管理工具

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用 Thread的start()更好.在新特征 ...

  7. 转载 线程池之ThreadPool类与辅助线程 - <第二篇>

    http://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html 一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线 ...

  8. C#线程篇---线程池如何管理线程(6完结篇)

    C#线程基础在前几篇博文中都介绍了,现在最后来挖掘一下线程池的管理机制,也算为这个线程基础做个完结. 我们现在都知道了,线程池线程分为工作者线程和I/O线程,他们是怎么管理的? 对于Microsoft ...

  9. 高并发之——不得不说的线程池与ThreadPoolExecutor类浅析

    一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但为什么在JDK1.5中又提供了线程池技术呢?这个问题大家自行脑补,多动脑,肯定没坏处,哈哈哈... 说起Java中的线程池技术,在很多 ...

随机推荐

  1. 简述Mesos API–files

    Below is a set of endpoints available on a Mesos agent. These endpoints are reachable at the address ...

  2. Oracle数据库之SQL基础(一)

    主要内容:用户与表空间:表与约束:查询语句. 一.概述 Oracle安装:访问官网,下载 二.用户与表空间 在安装Oracle时在开始菜单里可以用sql puls登录oracle. ★1.系统用户 s ...

  3. 用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

    一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库,它模仿了ActionScript的语法,用于html5的开发,目前实现的功能相对较少,还不能称之 ...

  4. 关于开源授权协议 GPL 和 LGPL

    GPL 是 GNU General Public License (GNU 通用公共许可证)的缩写形式:LGPL 是 GNU Lesser General Public License (GNU 宽通 ...

  5. tableview head

    http://stackoverflow.com/questions/18880341/why-is-there-extra-padding-at-the-top-of-my-uitableview- ...

  6. 在windows下配置pthread

    http://blog.csdn.net/qianchenglenger/article/details/16907821 简单介绍windows平台下的pthread线程库

  7. SQL 2012 连接失败

  8. hunnu 修路

    ing········ 这题我一眼就想到二分修路的长度 可是还有一个问题,有个费用,如果没有的话就所有的边都连起来判断能否二分到最小可行的 可是,有费用... 怎么做呢... ... 有了费用后,就不 ...

  9. SQL静态

    静态 1.普通成员普通成员都是属于对象的用对象调用 2.静态成员静态成员是属于类的用类名调用 class FenBi{public int length;//普通成员public string col ...

  10. Android Studio更新升级方法(转)

    自从2013 Google I/O大会之后,笔者就将android ide开发工具从eclipse迁移到Android Studio了,android studio一直在更新完善,为了与时俱进,我们当 ...