Ala*_*inD -1 delphi multithreading
我试图覆盖虚拟TThread :: Terminate方法,但我发现只有在设置Terminated标志后才会调用我的覆盖.实现这个的正确方法是什么?
TTestThrd = class(TThread)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Execute(); override;
procedure DoTerminate(); override;
public
{ Public declarations }
end;
procedure TTestThrd.Execute();
var
bTerminated: Boolean;
begin
// This is the main thread loop
try
while (not Terminated) do
begin
// Sleep or use TEvent::Waitfor...
end;
finally
// Terminated (or exception) so free all resources...
bTerminated := True; // Why is this called...
end;
end;
procedure TTestThrd.DoTerminate();
var
bDoTerminateCalled: Boolean;
begin
bDoTerminateCalled := True; // ...before this?
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
据我了解,问题中缺少信息.重要的是要阅读您之前的问题(线程内部睡眠的替代方案)和评论线索.
您正在尝试安排一个调用来Terminate指示您的线程正在等待的事件.为了实现这一点,您需要将呼叫挂钩Terminate.等待DoTerminate或者OnTerminate因为它们在线程程序完成后执行是不好的.
在现代版本的Delphi中,您可以覆盖TerminatedSet.这正是你所需要的.它是从内部发射的Terminate.
在旧版本的Delphi中,在此方法之前,无法通过该Terminate方法进行通知.据我了解,这是关键点.你希望挂钩Terminate,在TerminatedSet添加之前,没有这样的钩子存在.
如果TerminatedSet您无法使用,那么您需要在类上提供一个调用方法Terminate,然后执行您必须执行的任何其他操作.例如:
procedure TMyThread.SignalAndTerminate;
begin
FTerminationEvent.SetEvent;
Terminate;
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
735 次 |
| 最近记录: |