线程如何终止? ( 积分: 50 )

  • 主题发起人 主题发起人 hawii
  • 开始时间 开始时间
H

hawii

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题比较菜,哪位老兄帮我看看。
type
TWatch=class(TThread)
private
protected
procedure Execute;
override;
public
constructor Create;
//构造函数
destructor Destroy;
override;
//析构函数
end;

procedure TWatch.Execute;//做死循环。
begin
repeat
Beep;
Sleep(500);
until False;
end;

为什么我在窗体里
procedure TForm1.FormCreate(Sender: TObject);
var
pid:Integer;
begin
Watch:=TWatch.Create;
Watch.OnTerminate:=btn1Click;
Watch.Resume;
end;

//按钮终止,为什么不行呢?线程海在运行。我关了程序都不行。还是一直响。
procedure TForm1.btn1Click(Sender: TObject);
begin
Watch.Terminate;
end;

老兄,帮我看看为什么?啊?分不多了。50吧。
 
procedure TWatch.Execute;//做死循环。
begin
while not Terminateddo
begin

Sleep(500);
end;
end;
 
procedure TWatch.Execute;//做死循环。
begin
repeat
Beep;
Sleep(500);
if Terminated then
<<-- 加入终止循环语句
Break;
until False;
end;
 
to nicai_wgl
一个判断可完成的分开了两个,对速度有要求的程序就慢很多了。
 
呵呵,白兄见教,只是想说明问题所在,没考虑效率问题。
 
也就是线程的Terminate方法就是设一个Terminated :=true;是吗?不对内容进行强行终止阿?
如果我要挂起呢?因为我在btn1Click理Watch.Suspend;
也是没用的。
应该如何处理呢?
 
如果要中止线程,直接用 xxx.Terminate, 那 xxx.Terminated就会自动变成 True.
Suspend应该可以用的吧
 
把你的源代码给你拿下来,然后告诉你为什么吧。
procedure TForm1.FormCreate(Sender: TObject);
var
pid:Integer;
begin
Watch:=TWatch.Create;
Watch.OnTerminate:=btn1Click;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
线程的onterminate事件是在线程结束的时候触发的事情。
Watch.Resume;
end;

//按钮终止,为什么不行呢?线程海在运行。我关了程序都不行。还是一直响。
procedure TForm1.btn1Click(Sender: TObject);
begin
Watch.Terminate;
~~~~~~~~~~~~~~~~~~
而你居然想在线程结束事件触发的时候,来给这个线程一个结束操作。逻辑混乱啊。
end;
下面是修改的建议:
1.把watch的onterminate这以行给注释了。
然后运行看看,应该没有问题了吧。
当然,如果你非要使用onterminate这个事件,那就重新写一个吧,比如结束的时候,给你弹出一个对话框来告诉你,结束了。
 
procedure TWatch.Execute;//做死循环。
begin

freeonterminated:=true;// 加
repeat
Beep;
Sleep(500);
until False;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
pid:Integer;
begin
Watch:=TWatch.Create;
//减 Watch.OnTerminate:=btn1Click;
Watch.Resume;
end;

即可!
 
cqwty,兄:
Watch.OnTerminate:=btn1Click;
是为了让线程结束时作个处理,其实后面还有作判断的语句,是没问题的,我看别人写的对文件的md5加密就是这么干的。
现在问,当线程suspend的时候,他的terminated属性是什么?
 
现在问,当线程suspend的时候,他的terminated属性是False
 
当线程suspend的时候,他的terminated属性是False
这就比较奇怪了,为什么做死循环的时候,suspend也不行呢?
 
多人接受答案了。
 
后退
顶部