谁知道如何安全的终止线程(20分)

G

Gec

Unregistered / Unconfirmed
GUEST, unregistred user!
我终止老引发4机
 
thread.Terminate
 
你在线程里干什么了?
是不是线程里有别的线程呢?那样终止这个线程,就会出错
 
最好的办法当然等线程执行结束了,正常退出.
 
同意 楼上的观点,在线程执行时不要干扰,让他自己结束,不过可以在
Destroy时做点释放内存之类的处理
 
一、线程的Execute方法执行完毕后线程就自动终止了,不用人工干预。
二、在Execute方法里将FreeOnTerminate := true,保证系统在线程
终止的时候能自动清理内存;
三、如果你Execute方法里是无限循环,可以在使用MYtHREAD.Terminate
来终止线程;
四、在Execute方法里使用下面语句:
if not Terminated then
begin

your code
end ing
fang
 
最安全的线程终止方法:
1.线程建立时用CreateEvent创建一个事件FStopEvent.
FStopEvent := CreateEvent(nil, True, False, nil);
2.用标志boolean FRunning标识线程状态.
3.如果有多个事件要等待,用:
FRunning := true;
while not Terminateddo
begin
case WaitForMultipleObjects(...) of
WAIT_OBJECT_0: break;

end;


end
FRunning := false;
3.如果无事件等待,用
FRunning := true;
while not Terminateddo
begin
if WaitForSingleObject(FStopEvent, 100) = WAIT_OBJECT_0 then
break;
else
...
end
FRunning := false;
4.停止线程时用:
if Suppended then
Resume;
SetEvent( FStopEvent );
Terminated = true;
while FRunning then
Application.MessageProcess();
CloseHandle(FStopEvent);
 
同意BUGCOOL
 
你在窗口的Close事件中做一点延时,应该起作用,作用是等待线程结束
 
somethread.Terminate方法只是将Terminated属性置为True
Execute中执行的循环操作的话,需要判断Terminated属性是否为True,
如果为True,则应该跳出循环. 然后在最后处理垃圾. 在最后给窗体发送
一个自定义的消息通知窗体已经结束线程了.
窗体中接受自定义的线程结束消息, 在OnCloseQuery事件中:
CanClose := 所有线程都结束了么?
这样在线程结束前就无法关闭程序了.
 
顶部