首页 > 代码库 > 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主线程重入而导致程序卡死的解决方案
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。