多线程中止的一个问题,急,//bow(200分)

  • 主题发起人 主题发起人 forza
  • 开始时间 开始时间
F

forza

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主程序中启动一个线程
Trd_Scan:=TScanIP.Create(IP_base1,IP_end1,IP_base2,IP_end2,IPT);
在procedure TScanIP.Execute中又启动了另外的线程:
procedure TScanIP.Execute;
begin
..................
..................
UserGroup := TuserGroup.Create(false);
end;

这是一个扫描的过程。在这个过程中,我希望通过一个按钮来中止它的扫描工作

现在的问题是,我不知道如何才能安全的停止这两个线程。
对于trd_scan正在运行时,而UserGroup尚没有启动时,可以停止,但是当UserGr
oup也启动后,就出现错误了。
我使用:
procedure TForm1.Btn_StopClick(Sender: TObject);
begin
statusBar1.panels[1].text := '扫描已停止';
try
if assigned(trd_scan) then
begin
trd_scan.Suspend ;//不加这句好象也会报错
trd_scan.Terminate ;
end;
{
if assigned(UserGroup) then
begin
UserGroup.Suspend;
Usergroup.terminate;
end;
}
Btn_Start.enabled:= true;
exit;
except
MessageBox(handle,'线程已不存在!','提示',MB_OK+MB_ICONINFORMATION);
end;

但是当UserGroup运行起来之后,我就不知道如何停止它了。“线程已不存在”的
提示框会出现。
如何解决,很急。在线等
 
在TScanIP的destroy事件中终止UserGroup线程
 
加一个destroy吗,是不是和下面的一样?
destructor TScanIP.Destroy;
begin
.................
if assigned(usergroup) then
UserGroup.Destroy ;//还是使用terminate?
inherited Destroy;
end;
 
这样的话好象UserGroup还没有运行,trd_scan就会把它终止了
 
在TScanIP中我是这样调用UserGroup的
UserGroup := TuserGroup.Create(true);
UserGroup.FreeOnTerminate := true;
UserGroup.Resume ;
UserGroup.WaitFor;
但UserGroup运行后,就会报错了,问题在哪里
用UserGroup:= TUserGroup.Create(false);是正确的。
帮忙呀,很急的,:(
 
procedure TScanIP.Execute;
begin
UserGroup := TuserGroup.Create(false);
while not Terminateddo
begin
//你的处理;
end;
UserGroup.Terminate;
end;
 
不可以这样,因为在UserGroup中,有很多变量的值都是在TscanIp中获取的。
 
这样并不会影响你从TscanIp中获取变量的值的。
 
既然你的很多变量是在TscanIP中获取的,好象应该先中止usergroup,然后才中止tscanip才对。
另外停止前好象也没必要调用suspend,直接terminate不行吗?
 
但有一种情况是usergroup还没有启动,scanip还在运行,这是判断并中止usergroup怎么做呀?
把Create写在前面的,我也试了,Usergroup启动后,确实没有得到正确的赋值
 
从你贴出的TScanIP.Execute;过程来看,似乎是TScanIP执行完之后才启动TuserGroup线程,既然如此,就直接用主线程来控制TuserGroup线程好了。
 
没错,是后启动UserGroup的,但它也是个线程的操作。
我一开始的时候,在判断Scanip结束后,给主线程发送了一个消息,启动了usergroup进行进一步的扫描。后来发现这样其实与在scanip中启动是一样的效果,起码表面上是。
usergroup启动后,我想这时候,scanip这个线程应该是destroy了。
我想用一个按钮来控制整个扫描过程结束。当scanip运行的时候,肯定是停止它,这没有问题。
但当usergroup启动的时候,scanip已经被destory了(我想是),我的程序还是先判断assigned(trd_scan),这时就有报告错误了,但usergroup还在运行,没有停止。如何才能正确的停止两个。
 
从你后面的代码看,两个线程在主线程中都有变量记录,这就好办。TThread类可以产生一个OnTerminate事件,发生的时间Execute方法执行完之后,线程对象本身释放之前,并且是在主线程中执行,你只要在这个事件中将你的线程变量设为nil就行了。再执行if assigned(trd_scan) then
就不会错了。
 
thx1180,真的要thx你了,:)
能给我个mail吗,以后好问你问题。My Mail : fora_218@sina.com
 
多人接受答案了。
 
thx1180@sina.com
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部