首页 > 代码库 > Delphi主线程重入而导致程序卡死的解决方案

Delphi主线程重入而导致程序卡死的解决方案

Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc。

如果有BThread,调用了BThread.Synchronize(BProc),而BProc中释放了AThread

procedure TBThread.BProcbegin  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}

 

Delphi主线程重入而导致程序卡死的解决方案