让线程安全结束,彻底释放! (200分)

  • 主题发起人 主题发起人 monster
  • 开始时间 开始时间
M

monster

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序原来退出时,有时候按Ctrl+Alt+Delete能发现它的"尸体".
经调试,终于发现释放时如果线程处于挂起状态(Suspended),就在WaitFor里陷入了无限等待.
MyThread.Terminate;
MyThread.WaitFor;
//可能陷入无限等待
MyThread.Free;
跟踪代码:
Unit Classes;
function TThread.WaitFor: LongWord;
var
Msg: TMsg;
H: THandle;
begin
H := FHandle;
if GetCurrentThreadID = MainThreadID then
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!! 如果进入时线程处于挂起状态(Suspended)
//!!!!!! 循环一次就陷入无限等待
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while MsgWaitForMultipleObjects(1, H, False, INFINITE, QS_SENDMESSAGE) = WAIT_OBJECT_0 + 1do
PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE)
else
WaitForSingleObject(H, INFINITE);
GetExitCodeThread(H, Result);
end;
把我的释放线程部分改成这样
MyThread.Terminate;
if MyThread.Suspended then
MyThread.Resume;
MyThread.WaitFor;
MyThread.Free;
一切都OK,OK!!!
我的疑问是: 为什么会这样? Thread的源码为什么就不判断一下? 释放线程到底该怎样才最好???
 
如果线程在运行不退出THREAD确实会死等,而且线程如果挂起,主程序会死等,真是¥%%……—……
我的解决方法:跟你一样RESUME、TERMINATE,但不要WAITFOR,而是自己做一个超时等待,
超时后我用TerminateThread强行中止线程,然后FREE。
 
呵呵,那我遇到的情况还算好的拉,至少Resume后,怎么测试都会立即退出的 :-)
 
学习学习
 
》呵呵,那我遇到的情况还算好的拉,至少Resume后,怎么测试都会立即退出的 :-)
我在线程中执行SQL查询一个大数据库,经常一个SQL要执行几分钟且难以中止:(
这样我只好来硬的了。我是不是很强?
 
好办法!你是利用什么控件与SQL Server联络的?
 
>>我在线程中执行SQL查询一个大数据库,经常一个SQL要执行几分钟且难以中止:(
>>这样我只好来硬的了。我是不是很强?
这个招数我也用过,不过太麻烦了,如果是网际数据库就拔网线,如果是本地的就终止
数据库服务。
 
你做出来了,能帮我看看这个吗?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=567635
或是贴出你的线程查询的源程序?
 
占用我的地盘可是要给我分的哟:)
 
这个没有问题,只要你回答了我的问题,
分不会少的。
 
这里还有300分呢:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=573532
我自以为开始提到的方法已经彻底解决问题了,没想到在Dll里用到了它,
又释放不掉了!!!只能在可执行程序中这样用才释放掉!!!
我为这个破问题出了上千分了已经,快身无分文了:(
线程,我不信我找不出一种安全有效的释放你的方法!!!!!!!!!
 
to Oldtiger:我用DOA连接ORACLE
 
线程释放!线程释放!!线程释放!!!总共700分!!!!
 
关机,重启
 
to monster
>>呵呵,那我遇到的情况还算好的拉,至少Resume后,怎么测试都会立即退出的 :-)
你的线程为什么会被SUSPEND呢?
是不是你在另外某个地方将它SUSPEND了?
我用DELPHI做多线程这么多年,从来也没遇到过你的问题。
 
to monster:
有什么疑问吗?调用 Suspend 方法,只有相应地再调用 Resume,thread 才能恢复继续
运行啊。Waitfor 应该在 thread 运行状态下才起作用的。你自己已找到解决方法了。
 
要判断,通知线程关闭--〉等线程执行完毕--〉然后释放。
 
是可能在别的地方SUSPEND了,就是要处理这种情况下的线程释放.
坏蟑螂兄能给几个例子吗?谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
666
import
I
后退
顶部