Multithreading 控制TThread的执行流

Multithreading 控制TThread的执行流,multithreading,delphi,Multithreading,Delphi,如何暂停/继续TThread我正在寻找一种安全的替代方案,以取代已弃用的TThread.Suspend以及TThread.Resume这是我最终得到的解决方案。暂停/恢复的安全替代方案 type TMyThread = class(TThread) private FHandles: array[0..1] of THandle; protected procedure Execute; override;

如何暂停/继续
TThread
我正在寻找一种安全的替代方案,以取代已弃用的
TThread.Suspend
以及
TThread.Resume

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

     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;

Execute
method循环中等待一个事件。@TLama WaitForMultipleObjects可能吗?是的,WaitForSingleObject或WaitForMultipleObjects是您要查找的对象。更多信息我的线程中也有类似的东西(因为我只针对Windows平台,不喜欢
TEvent
类)。在这段代码中有一点我需要改进。在
Stop
方法中,我只写
Terminate
,退出事件将在
TerminatedSet
方法中发出信号。它允许在应用程序终止时优雅地退出线程(无需调用
Stop
)。在
Execute
方法中,当该事件发出信号时,您可以退出
Exit
。以某种方式识别事件也很好。也许这样更好!谢谢!:)@特拉玛:谢谢你的
TerminatedSet()
提示,我从来都不知道这个。看起来它是在XE2中/附近引入的。