阅读 102

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

 

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

 

5,总结

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

 

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

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐