本人初使用delphi ,不知如何来控制 terminated 属性,
我用
procedure TThread.Terminate;
begin
FTerminated := True;
end;
可是老是出错,请各位写一个最简单的能改变terminated 属性方法,我在这里先向您说声谢谢了.
我用
procedure TThread.Terminate;
begin
FTerminated := True;
end;
可是老是出错,请各位写一个最简单的能改变terminated 属性方法,我在这里先向您说声谢谢了.
procedure AThread.Execute;
begin
//线程停止时释放内存
FreeOnTerminate := True;
while true do
begin
//如果Terminated=true退出
if Terminated then exit;
sleep(100);
end;
end;AThread.Terminated:=true;就可以停止释放一个线程
-------------------------
(I)线程的中止
看了几本书,提到线程的中止主要有三种途径:线程所属进程中止;线程内部调用EndThread函数;线程外部调用TerminateThread函数。
1. 线程所属进程中止这一条似乎可有可无?(问题一)事实上每次应用程序关闭之前都还要检查是否还有未结束的线程,如果还有线程没结束比如正在进行数据库等操作,则关闭应用程序可能会出问题:( 对于这个问题,一直搞不清楚,有没有必要在应用程序结束前检查并结束所有线程?(问题二)
2.EndThread函数 当线程函数Excute()执行完毕,它会调用Delphi的标准例程EndThread,这个例程再调用A P I函数E x i t T h r e a d ( )。由ExitThread() 来清除线程所占用的栈。按照这种说法,我们在线程函数中直接调用EndThread(0)应该可以直接结束线程执行,并且释放了线程所占用的资源?(问题三:是这样的吧,我还没来得及试)这样就可以结合线程的Terminated属性,有如下代码了:
在线程函数中频繁检查Terminated属性
if(self.Terminated or Application.Terminated) EndThread(0)
3.TerminateThread函数是Win32API函数,其声明如下:function Te r m i n a t e T h r e a d ( h T h r e a d : T H a n d l e ; d w E x i t C o d e : D W O R D ) ; T T h r e a d的H a n d l e属性可以作为第一个参数,因此,Te r m i n a t e T h r e a d ( )常这样调用:
Te r m i n a t e T h r e a d ( M y H o s e d T h r e a d . H a n d l e , 0 )如果选择使用这个函数,应该考虑到它的负面影响。首先,此函数在Windows NT与在Windows 95/98下并不相同。在Windows 95/98 下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍然保留。其次,无论线程代码中是否有t r y. . . f i n a l l y块,这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知D L L,当D L L关闭时,这也容易出现问题(摘自Steve Teixeira和Xavier Pacheco的Delphi5开发人员指南,问题四:不知道这种情况对于win2000是否适用?)
4.关于waitfor方法 等待线程结束可以调用它的WaitFor方法。不过有些不解之处。比如Delphi5开发人员指南中有这样一段代码:
for i:=ThreadList.count-1 downto 0 do begin
TDrawThread(ThreadList[i]).Terminate;
TDrawThread(ThreadList[i]).waitfor;
//(问题五:如果线程设置了FreeOnTerminate:=true,则调用Terminate之后,有没有可能线程马上被终止且释放了资源,此时若调用waitfor会不会出问题?)
end; 综上,如果结束一个线程比较稳妥的方式是这样:首先,在线程函数中频繁检查Terminated属性,发现为True时,调用EndThread(0)方法结束线程;在需要的时候调用线程的Terminate方法将线程的Terminated属性设置为true即可达到结束线程的问题;为了确保线程已经终止,使用waitfor方法进行确认。
调用 athread.terminate方法会将此属性置为真。
的很好。
学习