Windows Qt 程序崩溃重启

        最近的项目需求,对方设备在无人值守时,一但程序出现错误死机,需要自己主动重启。所以就研究了一下Windows下Qt的崩溃重启。俗话说没有图BB个JB。

        大家都遇到过这种情况,当领导无聊时在办公室踱步,突然走到你身边询问项目进展,本来你想秀一波,没想到仓朗朗一声巨响弹出了上面的尴尬窗口。哈哈,平时自测都好好的,怎么你一来就直接宕掉了,这也太直观了吧!

         唉~  开个玩笑,不过你要是写成下面这个样子:

         呃... 起码不会很尴尬,毕竟你的程序优雅的活了起来。

          测试demo链接

         原理很简单,Qt的信号槽机制大家都知道,其实Qt程序在启动和退出时都会有信号发出,我么只需要捕获信号然后判断再执行操作就好了。QProcess 可以捕获的信号如下:

Windows Qt 程序崩溃重启_第1张图片

        这里我们用到了QProcess类,此外我们还需要另外一个监测程序,比如说写一个名为watchdog的程序作为监视。在watchdog中使用  

      void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite)

  启动主程序,第一个参数为可执行程序的路径,注意要用 “\\”间隔,QStringList类型的参数为程序运行时参数,如没有就直接写入QStringList()就好。

      这样:

    process->start("F:\\TEST\\TestView\\debug\\TestView.exe",QStringList());

然后,我们通过信号槽来获取主程的运行状态:直接connect就可以:

connect(process,SIGNAL(started()),this,SLOT(pro_started())) connect(process,SIGNAL(errorOccurred(QProcess::ProcessError)),this,SLOT(pro_error(QProcess::ProcessError))); connect(process,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(pro_finish(int,QProcess::ExitStatus))); connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(pro_StateChanged(QProcess::ProcessState)));

最主要的是程序结束时的  finished(int,QProcess::ExitStatus) 信号,

void finished(int exitCode, QProcess::ExitStatus exitStatus);

通过第一个int型参数,即主程序退出时的返回值,我们就可以得到程序是否为正常退出。

正常退出时  exitCode == 0,反之 exitCode < 0 的时候程序得表现为出错。

So,小于零 我们再 执行次  void QProcess::start()  操作就ok拉。

 

这样就可以神不知鬼不觉的把死掉的程序重启吗!!?

测试过你就会发现,程序出错时系统会弹出一个对话框:

Windows Qt 程序崩溃重启_第2张图片

这里如果不是手动关闭,死掉的程序是不会自己关闭的,所以接下来我们要做的就是在程序出错死掉时不让这个对话框弹出,而是直接退出。

        用到 Windows API中的: (百度百科)添加在main函数的开始

  WINBASEAPI LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter (LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);

异常捕获函数,IpTopLevelExceptionFilter(EXCEPTION_POINTERS *pException)  需自己实现一下。

里面直接return:

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{    // 在这里添加处理程序崩溃情况的代码    
     /*some function()*/    
     return EXCEPTION_EXECUTE_HANDLER;
}
最后做一下故障记录到文件,完美解决。

简单的写了一个测试demo,在这里:我是资源连接。

demo中按钮槽函数中写了一个错误,为: 获取vector的越界值。

vector test;

int i = test[100];

qDebug()<

测试重启成功。

写给不会的朋友,不喜勿喷,互相学习,如有不足,请多指教,谢谢。

 

你可能感兴趣的:(qt,知识点,可能会遇到的问题,Qt,Qt崩溃重启)