Delphi线程的终止
当线程对象的Execute()执行完毕,我们就认为此线程终止了。这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。
当结束使用TThread对象时,应该确保已经把这个Delphi对象从内存中清除了。这才能确保所有内存占有都释放掉。尽管在进程终止时会自动清除所有的线程对象,但是及时清除已经不再使用的对象,可以使内存的使用效率提高。利用将FreeOnTerminate的属性设置为True的方法来及时清除线程对象时最方便的方法,这只需要在Execute()退出之前设置就行了。设置的方法如下
procedure TTestThread.Execute;
var
i: Integer;
begin
FreeOnTerminate:= True;
for i:=1 to 2000000 do
inc(Answer, Round(Abs(Sin(Sqrt(i)))));
end;
这样,当一个线程终止的时候,就会触发OnTerminate事件,就会有机会在事件处理过程中清除线程对象了。
提示:OnTerminate事件是在主线程的环境中发生的。这就意味着,在处理这个事件的过程中,你可以不需要借助于Synchronize()而自由地访问VCL
要记住Execute()需要经常地检查Terminated属性的值,来确认是否要提前退出。尽管这将意味着当使用线程工作的时候,你必须关心更多的事情,但它能确保在线程结束时,能够完成必要的清除。下面是一段在Execute()增加处理操作的简单代码:
procedure TTestThread.Execute;
var
i: Integer;
begin
FreeOnTerminate:= True;
for i:= 1 to 2000000 do
begin
if Terminated then
break;
inc(Answer, Round(Abs(Sin(Sqrt(i)))));
end;
end;
注意,在某些紧急情况下,你可以使用Win32 API函数 TerminateThread()来终止一个线程。但是,除非没有别的办法了,否则不要使用它。例如,当线程代码陷入死循环中。TerminateThread()的声明如下
function TerminateThread(hThread: THandle; dwExitCode: DWORD);
TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用
TerminateThread(MyHosedThread.Handle, 0);
如果选择这个函数,应该考虑到它的负面影响。首先,此函数在Windows NT与在Windows95/98下并不相同。在Windows95/98下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍被保留。其次,无论线程代码中是否有try...finally块,这个函数都会使线程立即终止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的内存也没有被释放等情况。而且,这个函数在终止线程的时候也不通知DLL,当DLL关闭的时候,这也容易出现enti问题
Delphi线程的终止的更多相关文章
- 多线程的基本概念和Delphi线程对象Tthread介绍
多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...
- java 线程的终止与线程中断
关于线程终止: 1.一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了. 2.一些服务端的程序,可能在业务上需要,常驻系统.它本身是一个无穷的循环,用于提供服务.那对于这种线程我们该如何结 ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环
http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...
- Delphi线程池
unit uThreadPool; { aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); } inte ...
- TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)
在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了 ...
- delphi 线程教学第六节:TList与泛型
第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...
- Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist
Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...
- 并发基础(九) java线程的终止与中断
1.简单了解一下:为何不赞成使用 Thread.stop.Thread.suspend 和 Thread.resume? suspend .resume.stop方法分别完成了线程的暂停.恢复.终 ...
随机推荐
- 剑指Offer 两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点. 思路: 题目说的很笼统,应该是有2个链表,找出公共点,第一个公共点后面的链表是共同所有的.可以用map做,直接检测map里有没有出现这个节点. ...
- Linux_VPN—pptpd构架方法
以下是由本人测试可用的pptpd构架方法 按步骤: 运行环境Centeros 6 *首先运行如下命令: cat /dev/net/tun 返回的必须是: cat: /dev/net/tun: File ...
- 用消息机制解耦Activity跳转
我见过的Activity方式有三种: 1, 默认的,在一个Activity里创建一个Intent,然后startActivity/startActivityForResult: 2, 给被跳转到的Ac ...
- Python自动化装饰器问题解疑
问题一 到底是怎么执行的? import time def timer(timeout=0): def decorator(func): def wrapper(*args, **kwargs): # ...
- SVN钩子说明
post-commit在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略. post-lock对文件进行加锁操作之后执行该脚本 post-revprop-chan ...
- 11.6---矩阵查找元素(CC150)
思路,一旦提到查找就要想到二分查找. public static int[] findElement(int[][] a, int n, int m, int key) { // write code ...
- excle导入
public function import_upload(){ set_time_limit(900); if(!empty($_FILES ['xls_path']['name'])){ $tmp ...
- NGUI Table页(UIToggle和UIToggledObjects)
1.添加两个按钮Btn1和Btn2.添加2个Spr1和Spr2 2.给每个Btn添加两个脚本UIToggle和UIToggledObjects 3.将每个UIToggle的Group设置个非0的值 4 ...
- ios CoreData NSManagedObject 生命周期
用同样的检索条件从context检索出的对象是一个????所以 在主页的3个brand没法释放,在仅仅处理brand的时候???? 和 多个 context无关 我重写了NSManagedObject ...
- springMVC中ajax的使用
springMVC中使用ajax有两种方法,第一种是根据servletAPI来使用ajax,第二种是根据springMVC给我们提供的API来使用. 一.根据servletAPI: springMVC ...