完成运行之前如何停止线程

完成运行之前如何停止线程

本文介绍了完成运行之前如何停止线程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个叫做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 .

这篇关于完成运行之前如何停止线程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-01 16:43