当我停止线程'srch_slave_thread'并将终止标志设置为true时,(srch_slave_thread.terminate)释放线程停止在析构函数中的'inherited'行,为什么?它是一个等待它挂起?如果我在析构函数中注释掉“继承”,则线程停止并释放它自己。线程终止(再次...)
取出'继承'并调试代码后:为什么线程在调用析构函数后跳转到DoTerminate方法?
谢谢。
Tsrch_slave_thread = class(TThread)
private
FSW: TStopWatch;
protected
procedure Execute; override;
public
SimpleEvent: TSimpleEvent;
procedure DoTerminate; override;
...
constructor Create;
destructor Destroy; override;
end;
创建一个事件obj。在构造函数>>
constructor Tsrch_slave_thread.create;
begin
inherited create(true);
Fsw := TStopWatch.Create;
SimpleEvent := TSimpleEvent.Create;
end;
在调用析构函数之后跳转到这里? >>
procedure Tsrch_slave_thread.DoTerminate;
begin
inherited;
self.simpleEvent.SetEvent;
end;
危在旦夕在析构函数继承>>
destructor Tsrch_slave_thread.destroy;
begin
self.SimpleEvent.free;
inherited;
end;
这里创建线程>>
function TMaster.th_slvsearch_start: integer;
begin
if not Assigned(Fslave_search_thread) then begin
Fslave_search_thread := TFslave_search_thread.create;
...
end
else begin
...
exit;
end;
with Fslave_search_thread do
begin
master := self;
master_HWND := self.fMsgHandlerHWND;
FreeOnTerminate := false;
OnTerminate := slvsrch_termination;
start;
end;
end;
回采线程开始在这里>>
procedure TMaster.th_slvsearch_stop;
begin
Fslave_search_thread.Terminate;
end;
主题.Execute >>
procedure Tsrch_slave_thread.Execute;
var
text_orig: string;
activesearch: integer;
begin
FSW.Start;
while not terminated do begin
activesearch := master.CMD_LISTCNT;
//stopper refresh
synchronize(procedure begin
with self.master do
Fmasternode.text := FmasterDat.MstrName + ' (' + floattostr(Fsw.ElapsedMilliseconds/1000) + 'sec - Searching)';
end);
if (SimpleEvent.WaitFor(2000) <> wrTimeOut) or (activesearch <> 1) then break;
end;
FSW.Stop;
end;
OnTerminate事件处理>>
procedure TMaster.slvsrch_termination(Sender: TObject);
begin
if Assigned(Fslave_search_thread) then
begin
self.FLastSearchTime := Fslave_search_thread.FSW.ElapsedMilliseconds/1000;
Fslave_search_thread.Free;
Fslave_search_thread := nil;
self.Factive_slv_search := 0;
end;
...
end;
*“为什么线程在调用析构函数后跳转到DoTerminate方法?”*因为有人应该说线程终止,如果它不是明确的你,它是设置终止标志的析构函数。 – TLama
@TLama,是的,但我用srch_slave_thread.terminate设置标志 – grinner