Delphi主线程重入而导致程序卡死的解决方案
2014-09-10 21:07
239 查看
Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc。
如果有BThread,调用了BThread.Synchronize(BProc),而BProc中释放了AThread
此时我们的程序将会卡死,下面的代码可以避免死锁,是通用的线程等待结束代码。
如果以前没注意此重入问题,请修改你的代码吧。因为不能保证我们的代码被其他人用时不会出现重入。
此代码既支持Windows,也支持Android
不过包含的单元不一样:
如果有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)
- MFC项目使用webbrowser控件,点击载入的页面里的文件下载链接后导致程序的崩溃问题的解决方案
- [Android]Delphi/C++ Builder 开发 Android 程序启动画面简单完美解决方案
- netcore服务程序暴力退出导致的业务数据不一致的一种解决方案(优雅退出)
- MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案
- vc++6.0STL中std::string类导致程序崩溃的解决方案
- Delphi开发 Android 程序启动画面简单完美解决方案
- 安卓从googlephoto上选择云端图片导致程序崩溃的解决方案
- CFileDialog导致程序崩溃的解决方案
- Android:Consumer closed input channel or an error occurred. events=0x8异常导致程序异常终止问题解决方案
- android应用程序中对于ANR主线程超时不响应导致强制关闭的解决方案
- Win7下用Framework 4.0开发的程序,发布时找不到Framework 4.0的问题,导致系统无法正常访问的解决方案
- electron-config导致webpack打包后运行程序报错的解决方案
- Win7下用Framework 4.0开发的程序,发布时找不到Framework 4.0的问题,导致系统无法正常访问的解决方案
- myeclipse building workspace。导致程序变慢、卡死、不能正常操作的解决方案。
- Win7下用Framework 4.0开发的程序,发布时找不到Framework 4.0的问题,导致系统无法正常访问的解决方案
- Mac 内存被一个叫Installer的程序大量占用导致 内存严重不足 解决方案
- 关于Fragment中的getActivity()返回null导致程序崩溃的解决方案
- Asp.Net程序目录下文件夹或文件操作导致Session失效的解决方案
- Win7下用Framework 4.0开发的程序,发布时找不到Framework 4.0的问题,导致系统无法正常访问的解决方案