【问题标题】:Control execution flow of TThread控制TThread的执行流程
【发布时间】:2016-03-16 10:05:36
【问题描述】:

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

【问题讨论】:

  • Execute方法循环中等待一个事件。
  • @TLama WaitForMultipleObjects 也许?
  • 是的,WaitForSingleObject 或 WaitForMultipleObjects 就是您要找的。更多信息here

标签: multithreading delphi


【解决方案1】:

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

     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;

【讨论】:

  • 我的线程中有类似的东西(因为我只针对 Windows 平台并且不喜欢 TEvent 类)。我会在这段代码中改进一件事。在Stop 方法中,我只写Terminate,退出事件我将在TerminatedSet 方法中发出信号。这允许在应用程序终止时优雅地 退出您的线程(无需调用Stop)。在Execute 方法中,当此事件发出信号时,您可以只使用Exit。以某种方式识别事件也很好。也许like this.
  • @TLama 这更好!谢谢! :)
  • @TLama:感谢TerminatedSet() 的提示,我从来不知道那个。看起来它是在 XE2 中/附近引入的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多