晚辈的问题就是,程序正在运行中,已经放出10几个线程,在这些线程未全部运行完毕并返回之前,时可能需要关闭程序,这个时候应该怎么做?我的做法是这样: ThreadsPool.OnProcessRequest := DoMyWork;......
procedure TForm1.DoMyWork(Sender : TThreadsPool; WorkItem : TWorkItem;
aThread : TProcessorThread);
begin
if IsUserClose then
aThread.Terminate ; ......end;
但是怎么才能知道所有的线程已经全部Terminated,也就是什么时候才可以关闭程序。发消息给作者也不回复消息,所以只能靠使用过的前辈的指点了。要是这个uThreadPool 不好用的话,能否提供一个好用的uThreadPool和相关例子,谢谢。
procedure TForm1.DoMyWork(Sender : TThreadsPool; WorkItem : TWorkItem;
aThread : TProcessorThread);
begin
if IsUserClose then
aThread.Terminate ; ......end;
但是怎么才能知道所有的线程已经全部Terminated,也就是什么时候才可以关闭程序。发消息给作者也不回复消息,所以只能靠使用过的前辈的指点了。要是这个uThreadPool 不好用的话,能否提供一个好用的uThreadPool和相关例子,谢谢。
解决方案 »
- 棋牌客户端 左侧游戏列表的选择问题 类名 SysTreeView32
- 程序调试也错,大家帮我看看啊,点数50分,解决后立即结贴
- 如何在三层结构的应用服务器上建立一个procedure可以让客户机调用?在线等~~~~~~~~~~
- 为什么我用Insert语句插入一条重复的记录,不出异常啊?
- 内存泄漏?
- 消息处理问题
- 为什么SQL语句 select count(*) as RecCount from 信息 where DATEDIFF(day,日期, getdate()) > 10 SQLserver作为数据库时可以用access不
- 请教如何统计次数
- 50分求助。
- 问题急!急!急!!
- 关于delphi的图表chart问题~
- copy 共享文件
-------------------------
(I)线程的中止
看了几本书,提到线程的中止主要有三种途径:
1 线程所属进程中止;
2 线程内部调用EndThread函数;
3 线程外部调用TerminateThread函数。
1. 线程所属进程中止这一条似乎可行,事实上每次应用程序关闭之前都还要检查是否还有未结束的线程,如果还有线程没结束比如正在进行数据库等操作,则关闭应用程序可能会出问题
2.EndThread函数 当线程函数Excute()执行完毕,它会调用Delphi的标准例程EndThread,这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。按照这种说法,我们在线程函数中直接调用EndThread(0)应该可以直接结束线程执行,并且释放了线程所占用的资源?(问题三:是这样的吧,我还没来得及试)这样就可以结合线程的Terminated属性,有如下代码了:
在线程函数中频繁检查Terminated属性
if (self.Terminated or Application.Terminated) EndThread(0)
3. TerminateThread函数是Win32API函数,其声明如下:
function TerminateThread(hThread: THandle; dwExitCode: DWORD);
TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:
TerminateThread(MyhoseedThread.handle,0)如果选择使用这个函数,应该考虑到它的负面影响。无论线程代码中是否有try. . . finally块,这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知DLL,当DLL关闭时,这也容易出现问题.
4.关于waitfor方法 等待线程结束可以调用它的WaitFor方法。不过有些不解之处。比如Delphi5开发人员指南中有这样一段代码:
for i:=ThreadList.count-1 downto 0 do begin
TDrawThread(ThreadList[i]).Terminate;
TDrawThread(ThreadList[i]).waitfor;
end;
综上,如果结束一个线程比较稳妥的方式是这样:首先,在线程函数中频繁检查Terminated属性,发现为True时,调用EndThread(0)方法结束线程;在需要的时候调用线程的Terminate方法将线程的Terminated属性设置为true即可达到结束线程的问题;为了确保线程已经终止,使用waitfor方法进行确认。