How do I stop a thread before it's finished running?

后端 未结 3 1170
遇见更好的自我
遇见更好的自我 2021-02-06 15:03

I have a thread called TMyThread and I overrode the Execute procedure like this:

 procedure TMyThread.Execute;
 Begin
     repeat
     //Some Work 
     Sleep(50         


        
3条回答
  •  天命终不由人
    2021-02-06 15:52

    Using TEvent can solve this problem this 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 .

提交回复
热议问题