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}
  • 相关阅读:
    WIFI芯片,结构光和ToF
    Ubuntu + Python
    React-Native 报错处理
    GPS && AGPS
    Feed流
    Kafka基础知识总结
    Kafka海量日志收集架构之Watcher监控告警-watcher 基础语法与使用
    4-23学习心得
    4-22 学习心得
    4-21学习心得
  • 原文地址:https://www.cnblogs.com/hezihang/p/3965158.html
Copyright © 2011-2022 走看看