如何暂停线程?
How to pause a thread?
我想画点东西。因为 GUI 冻结,所以我想在一个线程中绘制。但有时我想暂停绘图(几分钟)。
Delphi 的文档说 Suspend/resume 已过时,但没有说明哪些函数取代了它们。
暂停和恢复已弃用。 Sleep和SpinWait显然不合适。我很惊讶 Delphi 不提供这样的基本 property/feature。
那么,我如何 pause/resume 一个线程?
您可能需要 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;
我想画点东西。因为 GUI 冻结,所以我想在一个线程中绘制。但有时我想暂停绘图(几分钟)。
Delphi 的文档说 Suspend/resume 已过时,但没有说明哪些函数取代了它们。
暂停和恢复已弃用。 Sleep和SpinWait显然不合适。我很惊讶 Delphi 不提供这样的基本 property/feature。
那么,我如何 pause/resume 一个线程?
您可能需要 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;