Delphi主線程重入而導致程序卡死的解決方案


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}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM