解决了一个工作线程有一些问题,我只是不明白为什么释放线程的OnTerminate事件处理程序(TMaster.slvsrch_termination)
中的线程死锁。 我使用postmessage而不是在线程执行同步来同步一些VCL控件,只是为了避免死锁。螺纹在释放线程时出现死锁
procedure Tsrch_slave_thread.Execute;
var
activesearch: integer;
begin
activesearch := 1;
FMaster.CMD_SEARCH;
FSW.Start;
while not terminated do begin
postmessage(FDevTree_HWND, WM_STOPPER_REFRESH, trunc(Fsw.ElapsedMilliseconds/1000), integer(FMasterNode));
//
if (SimpleEvent.WaitFor(SEARCH_DELAY_SEC) <> wrTimeOut) or (activesearch <> 1) then break;
activesearch := Fmaster.CMD_LISTCNT;
FSW.Stop;
end;
end;
procedure Tsrch_slave_thread.DoTerminate;
begin
inherited;
self.simpleEvent.SetEvent;
end;
FreeOnTerminate属性被设置为false:
...
Fslave_search_thread: Tsrch_slave_thread;
...
Fslave_search_thread.FreeOnTerminate := false
Fslave_search_thread.OnTerminate := slvsrch_termination;
...
procedure TMaster.slvsrch_termination(Sender: TObject);
begin
...
if Assigned(Fslave_search_thread) then
begin
Fslave_search_thread.free; //Deadlock, why?
Fslave_search_thread := nil;
end;
...
end;
怪异的......我得到了橙色的“一个新的答案已发布......”酒吧字面上,因为我正在点击答案按钮,但你的答案出现了比我早10分钟的时间戳。大卫,你的魔力永远不会惊叹! –
但他没有试图从同一线程的OnTerminate处理程序中释放该线程。据我所知它是2个不同的线程,他从主线程的OnTerminate事件释放slave线程。我错过了什么? –
@J ...我怀疑时删除了答案的原始版本。我想知道是否错误地调用'Free'会导致死锁。尽管这显然是错误的,但我认为不是。我认为僵局就在这个事件上。 –