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中/附近引入的。