我建立一个线程单元,在程序中使用这个线程单元,怎样才能判断这个线程单元是否已经执行结束?因为如果我重复调用就会产生错误!(20分)

  • 主题发起人 主题发起人 del520
  • 开始时间 开始时间
D

del520

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,我必须等这个线程单元执行完后才能进行第二次调用,怎么办?
procedure TTempKQ.DateTimePicker1Change(Sender: TObject);
Var
s:FMKQ;
begin
s:=fmkq.Create(false);
end;
//FMKQ就是一个线程单元。
 
简单的办法是做一个全局变量,来判断
 
不过我试过了,很奇怪,我开始也这么想的。
我用了个全局变量main.EndThread (Main是主form)
if Main.EndThread then
s:=fmkq.Create(false);
在fmkq的开始将这个Main.EndThread:=false,在fmkq结否时将Main.EndThread设为True
任然不行。。。
好像这个EndThread永远都是true一样.
 
调用结束后,你把它释放不就行了么。
 
1.在使用线程前,设定 FreeOnTerminate :=true 则在结束时将自动释放。
2.判断线程是否结束好象应该用 Terminated 而不是你的做法。
 
看看 例子里 QuickSort 是怎么做的
 
你要以试这个
s:=fmkq.Create(false);
//创建线程
s.OnTerminate :=ThreadDone;
//线程处理完后要处理的事

//==== 线程退出代码 ======
procedure TForm1.ThreadDone(Sender: TObject);
begin
{线程退出时你可以在这里执行想要的代码}
end;

//=====================================================
下面的是我要问的问题!
但我也一些问题!
就是当 s 的线程已经完成后,我用“s.threadid” 还是可以查到线程的ID,这代表线程
已退出了吗?但我用“s.Terminate”就会显示错误!这又代表线程已退出了吗?我真的
不是很明白!有什么方法可以得到线程是否退出了,当然说的不是我刚才说的方法啦!
s.OnTerminate :=ThreadDone;
//线程处理完后要处理的事
还有没有方法知道 s 已完成了!因为我把很多的线程保存在一个数组中,怎样才能知道
哪个线程已退出,请大家帮忙!
 
你在execute里面写线程处理完后要处理的事就行了
甚至还可以调用其他单元的过程.....
 
如果这样的你应该在Execute方法中建立循环
begin
while not Terminateddo
begin
//做你的事
Suspend;

end;
end;
这样你只要创建一次,当需要它再执行的时候就来个Resume,
想退出的时候,来个 Terminate;
Resume;
WaitFor;
Free;
这样好些,不要每次都创建
 
Avenir说的方法可以,我也是类似这么用的,不过不是用的suspend,用了一个互斥对象,
效果也一样,最后不用的时候用Terminate就行了
 
多人接受答案了。
 
后退
顶部