Delphi的線程可以通過調用AThread.Synchronize(AProc),可以將Proc放入主線程中同步運行,此時AThread將掛起,直到主線程執行完AProc。
如果有BThread,調用了BThread.Synchronize(BProc),而BProc中釋放了AThread
procedure TBThread.BProc begin AThread.Terminate; AThread.WaitFor; AThread.Free; end;
此時我們的程序將會卡死,下面的代碼可以避免死鎖,是通用的線程等待結束代碼。
AThread.Terminate; while not AThread.Finished do begin if GetCurrentThreadID = MainThreadID then //由於是通過Synchronize同步到主線程執行,所以調用CheckSynchronize,防止死鎖 CheckSynchronize(0); Sleep(1); end; FreeAndNil(AThread);
如果以前沒注意此重入問題,請修改你的代碼吧。因為不能保證我們的代碼被其他人用時不會出現重入。
此代碼既支持Windows,也支持Android
不過包含的單元不一樣:
uses System.SyncObjs, {$ifdef MSWINDOWS} Windows; {$endif} {$ifdef POSIX} Posix.Pthread; {$endif}