【问题标题】:How to pause a thread?如何暂停一个线程?
【发布时间】:2017-05-29 11:32:06
【问题描述】:

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

Delphi 的文档说 Suspend/resume 已过时,但没有说明哪些函数会替换它们。

不推荐使用暂停和恢复。 Sleep 和 SpinWait 显然是不合适的。我很惊讶地看到 Delphi 没有提供这样一个基本的属性/功能。

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

【问题讨论】:

  • 您设置了一个标志,您的线程会定期检查该标志。然后根据标志的值绘制或不绘制。
  • 使用事件和WaitForSingleObject...
  • @DavidHeffernan - 好的。当标志为 'DoNotDraw' 时,我用什么来暂停线程? THread.Sleep(100) 是个好主意??
  • 不。睡觉几乎总是一个坏主意。你可以等待一个事件。这样做而不是简单的标志。因此,在您的绘图循环中等待事件发出信号。在主线程中,当你想暂停绘图时重置事件。当您想恢复绘图时再次设置它。
  • @whosrdaddy - 请注意 :) 在搜索 WaitForSingleObject 文档时,我发现了这个:marc.durdin.net/2012/08/…

标签: multithreading delphi bitmap delphi-xe7


【解决方案1】:

您可能需要通过临界区进行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;

【讨论】:

  • 构造函数的继承不应该在代码的开头而不是结尾吗?
  • 这是在 Delphi 6 修复 TThread 的构造函数以将实际线程创建推迟到 AfterConstruction 之前学习到的常见模式。从那以后就没有必要像上面那样写了。
  • @DavidHeffernan:请原谅我不知道,但是从 D6 开始就不需要“如上所述”了?
  • @AlexJames 在派生构造函数末尾调用继承的构造函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多