Delphi中怎么结束线程(这个线程是定时执行的)(方案二)
2015-11-17 18:42
471 查看
上面所给出的第一种解决方案:
线程(Execute)在执行定时循环;然后先让 DestroyAThread设置 Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后再去通知DestroyAThread,再由DestroyAThread来显式调用线程的 Free方法来释放线程
所以结合 FreeOnTerminate的作用,复习一下:
类 Create 了就要 Free;
但 TThread(的子类) 有特殊性, 很多时候我们不能确定新建的线程什么时候执行完(也就是什么时候该释放);
如果线程执行完毕自己知道释放就好了, 所以 TThread 给了一个布尔属性 FreeOnTerminate, 如果为 True, 线程执行完毕后就会自释放.
进行改造:
首先在线程的Execute方法里面将 FreeOnTerminate设置为True,然后进行自己的定时循环执行;然后DestroyAThread设置Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后,因为FreeOnTerminate设置为True了,所以就不要再通知 DestroyAThread,自己在释放完资源、结束执行之后,就会自释放。
同样DestroyAThread设置Terminated属性之后,就可以直接退出,因为不需要在DestroyAThread里面显式释放线程。
同样也就不需要线程再有 CanFree这种通知别人来释放它的属性了,所以也能简化线程类的设计(在面向对象的程序设计中一个原则就是:类尽可能小,所以那些能不需要的属性、方法就不要去定义和使用,把冗余的属性和方法一定要去掉……)
所以新的代码可以是这样的
Execute方法:
DestroyAThread方法:
http://www.cnblogs.com/xumenger/p/4454115.html
线程(Execute)在执行定时循环;然后先让 DestroyAThread设置 Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后再去通知DestroyAThread,再由DestroyAThread来显式调用线程的 Free方法来释放线程
所以结合 FreeOnTerminate的作用,复习一下:
类 Create 了就要 Free;
但 TThread(的子类) 有特殊性, 很多时候我们不能确定新建的线程什么时候执行完(也就是什么时候该释放);
如果线程执行完毕自己知道释放就好了, 所以 TThread 给了一个布尔属性 FreeOnTerminate, 如果为 True, 线程执行完毕后就会自释放.
进行改造:
首先在线程的Execute方法里面将 FreeOnTerminate设置为True,然后进行自己的定时循环执行;然后DestroyAThread设置Terminated属性,通知线程去结束执行、释放资源;然后在线程结束执行、释放资源之后,因为FreeOnTerminate设置为True了,所以就不要再通知 DestroyAThread,自己在释放完资源、结束执行之后,就会自释放。
同样DestroyAThread设置Terminated属性之后,就可以直接退出,因为不需要在DestroyAThread里面显式释放线程。
同样也就不需要线程再有 CanFree这种通知别人来释放它的属性了,所以也能简化线程类的设计(在面向对象的程序设计中一个原则就是:类尽可能小,所以那些能不需要的属性、方法就不要去定义和使用,把冗余的属性和方法一定要去掉……)
所以新的代码可以是这样的
Execute方法:
DestroyAThread方法:
相关文章推荐
- Delphi中怎么结束线程(这个线程是定时执行的)(方案一)
- Delphi线程同步(临界区、互斥、信号量,包括详细代码)
- Delphi管理多线程之线程局部存储:threadvar
- Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)
- Delphi的文件操作(定义,关联,打开,读写,关闭)
- Delphi如何处理不同类型的文件
- Delphi中的异常处理(10种异常来源、处理、精确处理)
- Delphi中String类型原理介绍
- delphi精要学习3
- delphi 创建DLL文件 及其调用和注意事项
- 解决Delphi ADO无法为更新定位行
- c++builder delphi 调用dll dll编写
- delphi Stomp客户端连接 RabbitMQ(1)
- Delphi调用C++编写的动态链接库dll的方法
- Delphi中动态创建的Panel无法改变颜色的解决办法(要把Panel的ParentBackground设为False)
- Delphi泛型评测(30篇)
- Delphi XE 如何实现("再按一次退出") 然后退出程序
- C++ Builder/Delphi中的Form控件
- [原创]DELPHI木马DIY之生成服务端
- Delphi ADOQuery连接数据库的查询、插入、删除、修改