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}

 

你可能感兴趣的:(Delphi)