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