最近的项目需求,对方设备在无人值守时,一但程序出现错误死机,需要自己主动重启。所以就研究了一下Windows下Qt的崩溃重启。俗话说没有图BB个JB。
大家都遇到过这种情况,当领导无聊时在办公室踱步,突然走到你身边询问项目进展,本来你想秀一波,没想到仓朗朗一声巨响弹出了上面的尴尬窗口。哈哈,平时自测都好好的,怎么你一来就直接宕掉了,这也太直观了吧!
唉~ 开个玩笑,不过你要是写成下面这个样子:
呃... 起码不会很尴尬,毕竟你的程序优雅的活了起来。
原理很简单,Qt的信号槽机制大家都知道,其实Qt程序在启动和退出时都会有信号发出,我么只需要捕获信号然后判断再执行操作就好了。QProcess 可以捕获的信号如下:
这里我们用到了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) 信号,
通过第一个int型参数,即主程序退出时的返回值,我们就可以得到程序是否为正常退出。
正常退出时 exitCode == 0,反之 exitCode < 0 的时候程序得表现为出错。
So,小于零 我们再 执行次 void QProcess::start() 操作就ok拉。
测试过你就会发现,程序出错时系统会弹出一个对话框:
这里如果不是手动关闭,死掉的程序是不会自己关闭的,所以接下来我们要做的就是在程序出错死掉时不让这个对话框弹出,而是直接退出。
用到 Windows API中的: (百度百科)添加在main函数的开始
异常捕获函数,IpTopLevelExceptionFilter(EXCEPTION_POINTERS *pException) 需自己实现一下。
里面直接return:
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{ // 在这里添加处理程序崩溃情况的代码
/*some function()*/
return EXCEPTION_EXECUTE_HANDLER;
}
最后做一下故障记录到文件,完美解决。
简单的写了一个测试demo,在这里:我是资源连接。
demo中按钮槽函数中写了一个错误,为: 获取vector的越界值。
vector
int i = test[100];
qDebug()<
测试重启成功。
写给不会的朋友,不喜勿喷,互相学习,如有不足,请多指教,谢谢。