线程释放问题 ( 积分: 300 )

  • 主题发起人 主题发起人 muhx
  • 开始时间 开始时间
一般在线程中用TRY结构确保本身的释放,在其它线程释放创建的线程,应该只在主线程在终止的时候使用。
 
还有没有其他方法??
 
提醒一下,你这种情况,最好不要使用线程自身的那个WaitFor,很可能会出错误,主要原因是如果调用是在主线程中会导致等待以synchronize方式执行的同步方法,只有这个队列中的所有同步方法都被完成,队列为空时才会退出,而你又那么多的线程,如果线程中循环调用了此同步方法,一个不小心,你的系统就可能死锁。
给你一个建议反感,你可以使用WaitForMultipleObjects等待所有的线程,并设置超时,如果在等待时间内没有完成,则TerminateThread,哈哈,有点强硬还丢数据,但不出错误,就看你是要做什么了,无关紧要的还是可行的方案。
 
直接判断线程的句柄啊:
while WaitForSingleObject(XXXThread.Handle, 200) <> WAIT_OBJECT_0do
;
 
appfirst 说的对,多线程中自身的那个waitfor很变态,等待的时候窗体什么都干不了。所以建议大家多使用waitforsingalobject,waitformultipleobject,这些操作起来非常方便,而且不容易出错误。
 
事物的矛盾性,多线程能让你的程序执行起来更加迅速,但要控制好一个线程真的很难。
前面回的两次问题,我的程序只有两个线程,一个主线程一个附属线程,只需Terminate
和WaitFor一下再把创建的方法free一下就行了。
今天我的程序又添加了三个线程,四个线程的创建,挂起,唤醒,析构搞了一个下午才搞定。调试中也遇到了waitfor线程进入死循环,程序退不出来的问题。又回来看了上面几位大大的答复才明白怎么回事。
由于我的程序退出时才析构线程,数据丢失无关紧要,所以我大胆的把WaitFor删掉了,
没有加waitforsingalobject,waitformultipleobject这些操作,添加了一个异常处理。
汗~~~!今天又回来看看自己的答复真的很汗颜。。。做学问得虚心啊,自己都没弄明白就乱答帖子很不对。
 
学习嘛,肯定是因为没有搞懂才学习的,当然这种网络上的讨论是不会误导对方的,就是因为有了不同的想法才讨论的。但是对的最终会被所有人接受,同时给出对的答案的人也会因为讨论认真的思索自己回答是否正确的,这是个好事,总的来说,在多线程里面最重要的,也是最核心的问题,那就是注意资源的访问控制问题。注意这个问题,那就好处理多了。
 
可不可以在程序结束的时候对程序中的线程做个扫描,然后用ExitThread结束线程啊??
一般我都是用ExitProcess直接退出程序的,呵呵,见笑了。
 
你用的方法也并不是不可以,但是最安全的方法是保证你退出程序的时候,所有线程都结束,线程所用的资源都释放,这才是最重要的。如果你能做到这点,那在资源都释放完毕了之后,使用exitthread或者exitporcess也不是不可以。哈哈。
 
今天我还要上班,呵呵,下午下班之前放分,谢谢参与讨论的朋友们
有新的想法,请继续,谢谢
 
让线程所申请的资源都由一个统一的资源管理器来管理,这样,即便线程出了问题,也能
保证它所申请的资源能得到释放。不过,我认为最重要的还是对那些复杂、危险性较高的线
程做好自我状态管理,在最糟糕的情况下,即便自己无法释放了,也能让管理者安全的释放
掉。
 
这样
procedure TTestThread.Execute;
var
I: Integer;
begin
FreeOnTerminate := True;
for I := 1 to 2000000do
begin
//再多加点这个
if Terminated then
Break;

Inc(Answer, Round(Abs(Sin(Sqrt(I)))));
Synchronize(GiveAnswer);
end;
end;
 
抢分,哈哈
procedure FreeThread(_Thread: TThread);
var
i: Integer;
iExitCode: Cardinal;
begin
iExitCode := 0;
with _Threaddo
try
FreeOnTerminate := False;
Terminate;
if Suspended then
Resume;
for i := 1 to 20do
//等待线程退出
begin
GetExitCodeThread(Handle, iExitCode);
if iExitCode = STILL_ACTIVE then
Sleep(100)
else
break;
end;
if iExitCode = STILL_ACTIVE then
TerminateThread(Handle, iExitCode);
//强制结束线程
finally
Free;
end;
end;
 
后退
顶部