zoukankan      html  css  js  c++  java
  • 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,总结

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

  • 相关阅读:
    Cuckoo for Hashing_双哈希表
    nyoj113_字符串替换
    nyoj366_D的小L_字典序_全排列
    二叉树的前序 中序 后序 遍历(递归/非递归)
    Java 学习路线
    leetcode 04 Median of Two Sorted Arrays
    ThreadLocal 的机制与内存泄漏
    try finally 执行顺序问题
    Java中的类加载器
    快速理解Java中的七种单例模式
  • 原文地址:https://www.cnblogs.com/jackkwok/p/14537688.html
Copyright © 2011-2022 走看看