怎样强制性终止正在运行的线程?(50分)

  • 主题发起人 主题发起人 luckystart
  • 开始时间 开始时间
L

luckystart

Unregistered / Unconfirmed
GUEST, unregistred user!
我记得可以用application的一个method,
有谁能说得具体点?
这样做可以吗?
好像有人说这样不太好。
 
你指的是 Application.ProcessMessages;吧!这是用于长循环中对消息的响应。
强制性终止正在运行的线程用 TerminateProcess()。
 
这个怎么用啊?
terminateProcess?
谁可以给个例子吗?
 
第一种方法:发送消息
var
HWndCalculator : HWnd;
begin
// find the exist calculator window
HWndCalculator := Winprocs.FindWindow(nil, '计算器');
// close the exist Calculator }
if HWndCalculator <> 0 then

SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
第二种方法:use terminateprocess
var
H:THandle;
P:DWORD;
begin
H:=FindWindow(nil,'无标题 - 记事本');
if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
end;
 
luckystart:
Terminateprocess是终止进程吧。中止线程用TerminateThread。
TerminateThread可以强制结束线程,成功率很高,但不会释放资源,比较危险,
我的一个程序用了它之后经常会报奇怪错误,也不记得后来怎么搞好了。它的用法
是TerminateThread(Handle,ExitCode),Handle即线程句柄TThread.Handle,另一
个参数是线程返回值吧。WINDOWS API,你可以看看它的帮助。
 
luckystart:
原来两个问题都是你提的,我傻乎乎的答了两次。不过还是有点不一样。下面是
我对强制结束线程的小经验:
首先,如果线程在挂起,则不停RESUME至唤醒为止;
然后,执行线程的正常终止:Terminate,并等待,注意不能WAITFOR(那是死等),
应自己写等待过程。这个等待过程中要有消息循环,因为等待中有些线程需要它,
主线程一般不能挂起,否则可能会死掉;
等待超时,说明实在是不行了,这时只好强制终止了,然后把能释放的资源释放
掉(这里要防止资源被多次释放,可简单判断是否为NIL)。
 
接受答案了.
 
Huzzz,能说得更加详细一点吗?例如等待过程怎么写等等
 
SORRY to zhujianzhou!我以前写过,不过一时找不着了。
大约等待过程如下:
begin
如果线程在挂起,则不停RESUME至唤醒为止;
执行线程的正常终止Terminate;
保存当前CPU时间GetTickCount;
while 线程不结束do
begin
if 检查CPU时间超过10秒 then
begin
强制终止线程并释放资源。
Break;
end;
for I:=0 to 1000do
Application.ProcessMessages;
end;
end;
你看是不是跟我在上面说的一样(简直就只是换了个角度)
 
另外注意Application.ProcessMessages可能会引起一些意外的问题!!
 
Huzzz
TerminateThread(Handle,ExitCode)强制终止线程后怎样释放资源
我发现每终止一次内存就会多占用4k左右
 
这要你自己处理了,你可以在线程中写处理代码,如:
TMyThread = class(TThread)
...
public
destructor Destroy;
override;
end;
...
destructor TMyThread.Destroy;
begin
//在这里处理,和平常的类一样,把能释放的资源都释放掉。
//但如果是强制中止,你不能保证所有资源都能释放
inherited;
end;

然后调用:
if TerminateThread(MyThread.Handle,0) then
MyThread.Free;
 
TO HUZZZ
我在TERMINATE的时候报错了,是不是不能释放线程导致的? 有什么办法让线程在执行的
时候正常的中止它的执行吗,我是创建一个线程去执行应用服务器上的存储过程的。
 
jayxsjf, 是我没说明白吗?首先是能正常终止的,尽量正常终止;实在不行,才强制
中止。
对了,我已经回答了你这个问题,在你的问题里。
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=802640
 
TerminateThread(Handle,ExitCode)强制终止线程后
怎样释放资源
能举个例子吗?
 
后退
顶部