如何暂停一个帖子?

WeG*_*ars 3 delphi multithreading bitmap delphi-xe7

我想画一些东西.因为GUI冻结我想在一个线程中绘制.但有时我想暂停绘图(几分钟).

Delphi的文档说暂停/恢复已经过时,但没有说明哪些功能取代了它们.

不推荐使用Suspend和Resume.Sleep和SpinWait显然是不合适的.令人惊讶的是,德尔福没有提供这样的基本属性/功能.

那么,我如何暂停/恢复一个线程?

Pet*_*tov 6

您可能需要fPaused/fEvent通过关键部分进行保护.这取决于您的具体实施.

interface

uses
  Classes, SyncObjs;

type
  TMyThread = class(TThread)
  private
    fEvent: TEvent;
    fPaused: Boolean;
    procedure SetPaused(const Value: Boolean);
  protected
    procedure Execute; override;
  public
    constructor Create(const aPaused: Boolean = false);
    destructor Destroy; override;

    property Paused: Boolean read fPaused write SetPaused;
  end;

implementation

constructor TMyThread.Create(const aPaused: Boolean = false);
begin
  fPaused := aPaused;
  fEvent := TEvent.Create(nil, true, not fPaused, '');
  inherited Create(false);
end;

destructor TMyThread.Destroy;
begin
  Terminate;
  fEvent.SetEvent;
  WaitFor;
  fEvent.Free;
  inherited;
end;

procedure TMyThread.Execute;
begin
  while not Terminated do
  begin
    fEvent.WaitFor(INFINITE);
    // todo: your drawings here
  end;
end;

procedure TMyThread.SetPaused(const Value: Boolean);
begin
  if (not Terminated) and (fPaused <> Value) then
  begin
    fPaused := Value;
    if fPaused then
      fEvent.ResetEvent else
      fEvent.SetEvent;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 这是在 Delphi 6 修复 `TThread` 的构造函数以将实际线程创建推迟到 `AfterConstruction` 之前学习的常见模式。从那以后就没有必要像上面那样写了。 (2认同)