某个应用程序A,长期运行后,时不时出现“External exception E06D7363”错误,然后程序A就失去了反应,既不工作也不退出。
分析发现,程序A在运行中依赖第三方DLL,上述错误可能由DLL引发,因此无法避免该问题出现。
好在程序A从启动运行到出错的时间基本在2天以上,不算频繁,因此出问题后重启即可解决。
为此,需要设计一个程序出错后自动重启的机制。思路如下:
为此,需要程序A能在出错时,自动退出内存,实现“”自杀“。
首先想到的是 Application.Terminate;
错误出现在子线程中,直接在子线程中调用Application.Terminate语句,希望程序A能退出,结果发现程序无反应。
分析是子线程出错,可能已无法正常处理消息,因此,改为子线程向主线程发出退出消息,在主线程中执行Application.Terminate;
测试发现,程序A会弹出错误框等待用户反馈,自动退出失败。
继续分析如何避免程序退出时弹出错误框的方法。
网上找到下文,Delphi 中利用 SEH 屏蔽退出时的 Runtime Error
https://blog.csdn.net/hero_yin/article/details/2294691
采用上文方法,确实能防止退出时弹出异常。
对于普通单线程程序,可保障程序静默退出内存。
但是由于程序A是多线程程序,采用上述方法未弹出错误,但是也无法退出内存,即使已将子线程全部结束。
网上找到一篇文章,“delphi 查进程、杀进程EXE方法,非常有效”
尝试了一下,发现 TerminateProcess方法让程序退出非常有效。最终,实现了程序A在出错时自动重启。
出现问题时,解决问题的路径很多,不要局限于已知的方法。多查询别人的解决方案,多尝试几次,往往问题解决起来也不难。
原文:https://www.cnblogs.com/jackkwok/p/14537688.html