刚刚接触多线程,在窗体创建时建立线程,窗体关闭时释放线程。不管是手动释放还是自动释放,都会遇见程序无响应的状况。大家是否有遇见过?如果解决的?
解决方案 »
- delphi 7.0中 的SYSDATE 提示 在此上下文中不允许使用'SYSDATE'此处只允许使用常量 表达式 或者变量 不允许使用列名
- 怎么读出ie的历史纪录阿
- 求DELPHI 6.0下载
- 液晶(明基)显示器,显示字体有像风吹过的效果,应该怎么解决?
- 初学者,简单问题,50分
- 请教:我关闭程序时老是报错,但对程序没什么影响,怎么样可以把报错屏蔽掉,不让它显示出来???
- 安装工具那里有?
- 高分求高手求助:一个在Chart中画图的问题?
- delphi6的安装程序是用什么软件做的?
- 如何创建一个word 文件?和msword.documents.open不是一回事吧?
- DLL 中连接ACCESS数据库
- 求助ActiveX 兼容问题
释放线程的过程中,有一步是等待线程执行完毕,因此,如果你的线程一直在运行,那么自然就一直在等了,要么在线程的执行过程中加条件判断,或者
如果这个Form是主窗口的话,在窗口关闭那里直接写上
ExitProcess(0);让Windows去回收即可.
begin
repeat
//执行代码
until isture ;//istrue判断条件
end;
在窗体关闭时,代码:
begin
istru:=true;
线程.free;
end;//仍然存在这样的问题
另外,线程是在dll文件中建立的,使用ExitProcess(0);肯定不行的
repeat
Recv... ,阻塞在此,必须有数据了才继续往下,才会判断条件,也就是说这种情况,即使条件设置了也是没作用的,
until isture ;//istrue判断条件
这种情况很多,比如Sleep/WaitForSingObject一个比较长的时间等等,或者执行一次非常耗时的计算,都是如此,
如果WaitForSingObject,可以改成WaitForMultipleObjects,加一个信号进去,一起等,然后判断信号源,
如果是执行一次非常耗时的计算(如计算一个大的报表),那就判断条件下放,让执行过程始终会在一个较短的时间内执行判断条件.如果窗口关闭后就结束程序的话,如果没有特别需要处理的事情,可以ExitProcess(0),不在乎线程在哪里创建,也不在乎申请了多少内存,都统统让Windows处理
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;
用TThread类来创建线程,在现在的execute中写了
begin
repeat
....
until terminated
end;在窗体关闭时,添加
线程.terminate;这样仍出现程序无响应的状况。
还是无响应