本文介绍了完成运行之前如何停止线程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个叫做TMyThread的线程,我覆盖了执行过程,如下所示: procedure TMyThread.Execute;
开始
重复
//一些工作
睡眠(5000);
//一些工作2;
睡眠(5000);
直到FActive = False
结束;
在主窗体中,我有一个名为Destroy My Thread的按钮。我想破坏我的线程,但是问题是我的线程只有在完成它的工作才会被销毁。即使没有完成工作,我也想破坏我的线程。如何做到这一点?
解决方案
使用TEvent可以解决这个问题
这是一个例子:
使用SyncObjs;
TMyThread = class(TThread)
private
FTerminateEvent:TEvent;
protected
procedure Execute;覆盖
public
构造函数Create(ACreateSuspended:Boolean);超载;
析构函数覆盖
程序停止;
结束
构造函数TMyThread.Create(ACreateSuspended:Boolean);
begin
FTerminateEvent:= TEvent.Create(nil,True,False,'FTerminateEvent');
继承Create(ACreateSuspended);
结束
析构函数TMyThread.Destroy;
begin
FTerminateEvent.Free;
继承;
结束
程序TMyThread.Stop;
begin
终止;
FTerminateEvent.SetEvent;
结束
程序TMyThread.Execute;
开始
而不是终止do
开始
//做一些有趣的事情!
FTerminateEvent.WaitFor(5000);
结束
结束
现在,如果我想杀死我的线程,我所要做的就是调用MyThread.Stop调用MyThread.Free。
I have a thread called TMyThread and I overrode the Execute procedure like this:
procedure TMyThread.Execute;
Begin
repeat
//Some Work
Sleep(5000);
//Some Work 2;
Sleep(5000);
until FActive=False
End;
In the main form I have button called 'Destroy My Thread'. I want to destroy my thread but the problem is that my thread will be destroyed only if it finish its work. I want to destroy my thread even it has not finished its work. How do I do this?
解决方案
Using TEvent can solve this problemthis is an eg :
uses SyncObjs;
TMyThread = class(TThread)
private
FTerminateEvent: TEvent;
protected
procedure Execute; override ;
public
constructor Create(ACreateSuspended: Boolean); overload;
destructor Destroy; override;
procedure Stop;
end;
constructor TMyThread.Create(ACreateSuspended: Boolean);
begin
FTerminateEvent := TEvent.Create(nil, True, False, 'FTerminateEvent');
inherited Create(ACreateSuspended);
end;
destructor TMyThread.Destroy;
begin
FTerminateEvent.Free;
inherited;
end;
procedure TMyThread.Stop;
begin
Terminate;
FTerminateEvent.SetEvent;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// do somthing interesting!
FTerminateEvent.WaitFor(5000);
end;
end;
Now if i want to kill my thread ,all what i have to do is calling MyThread.Stop than calling MyThread.Free .
这篇关于完成运行之前如何停止线程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!