控制TThread的执行流程

Dan*_*uer 4 delphi multithreading

我怎样才能暂停/继续TThread我要寻找一个安全的替代已过时的TThread.Suspend藏汉作为TThread.Resume

Dan*_*uer 5

这是我最终得到的解决方案。暂停/恢复的安全替代方案。

     type
      TMyThread = class(TThread)
      private
        FHandles: array[0..1] of THandle;
      protected
        procedure Execute; override;
      public
        constructor Create;
        destructor Destroy; override;
        procedure Pause;
        procedure UnPause;
        procedure Stop;
      end;

      constructor TMyThread.Create;
      begin
        inherited Create(False);
        FHandles[0] := CreateEvent(nil, False, False, nil);
        FHandles[1] := CreateEvent(nil, True, True, nil);
        FreeOnTerminate := True;
      end;

      destructor TMyThread.Destroy;
      begin
        CloseHandle(FHandles[1]);
        CloseHandle(FHandles[0]);
        inherited Destroy;
      end;

      procedure TMyThread.Execute;
      begin
        while not Terminated do
        begin
          case WaitForMultipleObjects(2, @FHandles[0], False, INFINITE) of
            WAIT_FAILED:
              RaiseLastOsError;
            WAIT_OBJECT_0:
              Terminate;
            WAIT_OBJECT_0 + 1:
              begin

              end;
          end;
        end;

      end;

      procedure TMyThread.Pause;
      begin
        ResetEvent(FHandles[1]);
      end;

      procedure TMyThread.UnPause;
      begin
        SetEvent(FHandles[1]);
      end;

      procedure TMyThread.Stop;
      begin
        SetEvent(FHandles[0]);
      end;
Run Code Online (Sandbox Code Playgroud)

  • @TLama:感谢“TerminatedSet()”提示,我从来不知道那个提示。看起来它是在 XE2 中/附近引入的。 (2认同)