强行终止线程,急,谢(200分)

  • 主题发起人 13156191019
  • 开始时间
1

13156191019

Unregistered / Unconfirmed
GUEST, unregistred user!
在主程序的某个子窗口上,我创建了一个线程,此线程会运行很长时间
var
mythread:tthread;
mythread:=exec_thread.Create();//exec_thread为已经定义好的线程类
在线程运行过程中,我想关闭这个子窗口,关闭之前肯定要强行终止这个线程吧,我就用TerminateThread(mythread.Handle, 0);
但是子窗口关闭后,我关闭了主程序,在WIN2000的任务管理器中该主程序对应的进程还存在,而且过一会蹦出一堆错误来,我想那个线程还是没有彻底停止或者释放的原因吧,我该怎么停止这个线程呢[:(][:)][:D][8D]
 
也有这种可能吧:在释放你的那个线程的时候,因为这个地方出错了.所以..会提示你的那些错误.
一般线程终止程序关闭的时候,
调用 mythread.terminate
就可以释放了.
 
TO:itren
你说的是一般的,我说的是强行终止,比如线程正在调用长时间的存储过程,肯定不能正常终止吧,必须要强行终止[:D]
 
>>强行终止线程
關注, 正常我是用加個
waitForSingleObject(thiread.handle...
來等待的!
 
Maybe mythread has used global variables or mainform's variables.
Call WaitForSingleObject after TerminateThread to waiting for mythread's
real termination, then
quit Application.
 
TO:lichengbin
我在线程里边只用了一个外部的临界区变量,以保持多个线程的同步,轻伤变量外能否说明一下waitForSingleObject的具体用法
大家还有其他办法吗[8D][:)]
 
强制中止线程不太可取,因为这样在线程中创建的对象就不会被很好的释放。
如果,关闭进程时线程没有结束,最大的可能是线程没有写好,比如你可以在mythread.Create中加入FreeOnTerminate := True,
然后在mythread.Execute中
begin
while not Terminateddo
begin

......
end;
end;
并且还要注意在释放线程时,线程中的挂起是不是恢复了,比如楼上说的函数,如果用在线程中,在线程结束时是不是给他信号了,如果没有给WaitForSingleObject发信号,是肯定要出问题的.
 
mythread.terminate
没有用的, 要在线程执行体中不断检查TREMINATED变量, 一看的为TRUE就结束执行, 线程属性设这TERMINATED后自动释放.这是DELPHI的例程.terminate只是修改线程的TREMINATED变量,结束的代码都要自已写的.
如果楼主的情况, 我认为是没有什么办法的. 只能把一个大的过程分成小的循环代码.才能提高线程的响应速度.
 
WaitForSingleObject是标准Win32 API,你可以查MSDN,上便有详细解释
 
再次声明一下,线程内可能执行长时间的操作,不能正常终止,资源不释放没有关系,[:)]
只要做到,终止线程后,关闭主程序,在win2000的任务管理器中看不到该进程就可以了,[:)]请大家不要再发正常终止的方法,现在就需要强行终止[:D]
 
给你个狠点的吧:
var
arrHandle: array[0..2] of Thandle;
begin

if CodeWorker <> nil then
begin
arrHandle[0] := CodeWorker.Handle;
CodeWorker.Terminate;
if WaitForMultipleObjects(1, @arrHandle, true, 5000) <> WAIT_OBJECT_0 then
begin
TerminateProcess(GetCurrentProcess, 1);
end
else
begin
WriteTask;
end;
end;
end;
 
DWORD WaitForSingleObject(
HANDLE hHandle, // handle of object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);
You can use as follows:
TerminateThread(mythread.Handle, 0);
WaitForSingle(mythread.Handle, INFINITE);
After this, free resources( DeleteCriticalSection(myCritialSection) )
and quit Application.
 
TerminateThread可以强制结束线程,成功率很高,但不会释放资源,比较危险,
它的用法是TerminateThread(Handle,ExitCode),Handle即线程句柄TThread.Handle,另一
个参数是线程返回值吧。WINDOWS API,你可以看看它的帮助。
 
TO:lichengbin
临界区变量还要释放吗,是不是数组变量也要释放阿,还有哪些变量需要释放,怎么判断变量是否需要释放[:D],我知道Tdatabase、Tsession、Tquery等变量需释放
 
就是用WINAPI强行终止, 也有很大机会报错. 以后会变成一个随机性的BUG, 很烦的. 还是建议不要这样做.
其实如果可以试试用
TThread.Suspend
然后直接关掉主程序, 应该可以的.
 
TO:robot88, TThread.Suspend能让线程马上停止工作吗,关闭子窗口后,再关闭主程序后,还会在win2000的任务管理器中看到该进程吗[8D]
 
CriticalSection is system resource, initialize before using, and you'd better
delete it after using, although after process has been terminited, all memory
data and resources will be released. Dynamic array variables needn't release,
it is managered automatically by Delphi, but objects that you dynamically
created and pointers that you dynamically alloc memory need release by you.
 
为什么程序调用WaitForSingle(mythread.Handle, INFINITE),报错误“没有定义该函数WaitForSingle”,INFINITE还用定义吗[:D][:)]
 
Sorry for my type incorrect.
WaitForSingleObject
 
WaitForSingleObject, 你打錯了!
 
顶部