zoukankan      html  css  js  c++  java
  • 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}
  • 相关阅读:
    msp430入门编程41
    msp430入门编程40
    msp430入门编程37
    msp430入门编程36
    msp430入门编程35
    msp430入门编程34
    msp430入门编程33
    msp430入门编程31
    msp430入门编程32
    msp430入门编程30
  • 原文地址:https://www.cnblogs.com/hezihang/p/3965158.html
Copyright © 2011-2022 走看看