读书人

Delphi 大伙是否遇见过:程序创建线程

发布时间: 2013-01-28 11:49:56 作者: rapoo

Delphi 大家是否遇见过:程序创建线程后,关闭时程序无响应的状况
刚刚接触多线程,在窗体创建时建立线程,窗体关闭时释放线程。不管是手动释放还是自动释放,都会遇见程序无响应的状况。大家是否有遇见过?如果解决的?
[解决办法]
窗体关闭时释放线程
释放线程的过程中,有一步是等待线程执行完毕,因此,如果你的线程一直在运行,那么自然就一直在等了,

要么在线程的执行过程中加条件判断,或者
如果这个Form是主窗口的话,在窗口关闭那里直接写上
ExitProcess(0);让Windows去回收即可.
[解决办法]
以下情况,条件判断是没用的
repeat
Recv... ,阻塞在此,必须有数据了才继续往下,才会判断条件,也就是说这种情况,即使条件设置了也是没作用的,
until isture ;//istrue判断条件
这种情况很多,比如Sleep/WaitForSingObject一个比较长的时间等等,或者执行一次非常耗时的计算,都是如此,
如果WaitForSingObject,可以改成WaitForMultipleObjects,加一个信号进去,一起等,然后判断信号源,
如果是执行一次非常耗时的计算(如计算一个大的报表),那就判断条件下放,让执行过程始终会在一个较短的时间内执行判断条件.

如果窗口关闭后就结束程序的话,如果没有特别需要处理的事情,可以ExitProcess(0),不在乎线程在哪里创建,也不在乎申请了多少内存,都统统让Windows处理
[解决办法]
1.是用的TThread类来创建线程的,里面有一个terminate;
2.用CreateThread,会返回一个Handle,然后再用一个while来判断


var
hwnd:Thandle; //线程句柄
ExitCode;Dword;
//退出码,STILL_ACTIVE代表线程依然在执行,如果线程中有返回值的话,线程执行结束就是获得其返回值。
begin
hwnd:=Createthread(.....);
while true do
begin
GetExitCodeThread(hwnd,ExitCode);
if ExitCode<>STILL_ACTIVE then break;
end;
end;

[解决办法]
win7 系统么?
[解决办法]
应该是你用法有问题。正常情况下,线程函数执行完毕之后,线程会自动的退出,线程内核会被触发,这就预示着线程准备结束了。

读书人网 >.NET

热点推荐