Delphi程序“自杀”的有效办法

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方法,非常有效

https://blog.csdn.net/josencom/article/details/81953398?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-11.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-11.control

尝试了一下,发现 TerminateProcess方法让程序退出非常有效。最终,实现了程序A在出错时自动重启。

5,总结

出现问题时,解决问题的路径很多,不要局限于已知的方法。多查询别人的解决方案,多尝试几次,往往问题解决起来也不难。

原文地址:https://www.cnblogs.com/jackkwok/p/14537688.html