一,背景

一台windows电脑,只允许一个我方开发的软件,并且设置了自定义桌面的方式,也就是说没有桌面,软件一旦崩溃或者无响应,那么用户只能是重启电脑,体验很差,所以单独写一个守护进程,当主进程出现崩溃或者无响应的时候,重新启动主进程。

二,思路

1,利用进程间通信的方式,主进程和守护进程发送请求并回应请求,比如主进程向守护进程发送心跳包,守护进程收到后回应,如果守护进程约定时间内收不到,则重新启动主进程,实现方式:

(1),udp通信

(2),QtRO  Qt 最新的进程间通信方式,类似linux下的dbus。

2,守护进程 定时扫码主进程是否存在,不存在则重启。

三,实现

开始利用了udp的方式进行实现,但是在运行一个第三方sdk的时候,udp会阻塞,导致守护进程以为主进程挂掉,实际主进程没有挂掉,只是慢了一些,并且不同机器,慢的时候还不一样,所以最终选择了 第二种方式,实现起来也特别简单,后期有通信需求,可以利用QtRO的方式,并且大部分函数都是依赖系统原生。

1,定时器,每隔两秒进行检查,如果进程不存在后者进程存在但是未响应,则重启启动程序。

void MainController::sl_triggered()
{HWND hd = GetWndHwnd(const_cast<char*>("hidteacher.exe"));bool restart = false;if(hd==NULL){ //进程不存在或者进程未响应restart=true;}else{if(IsHungAppWindow(hd)){restart=true;}}if(restart){startApp();}
}
#include <WinUser.h>
#include <Windows.h>#include<iostream>using namespace std;
typedef struct tagWNDINFO
{DWORD dwProcessId;HWND hWnd;
}WNDINFO, *LPWNDINFO;BOOL MyEnumProc(HWND hWnd, LPARAM lParam)
{DWORD dwProcId;GetWindowThreadProcessId(hWnd, &dwProcId);LPWNDINFO pInfo = (LPWNDINFO)lParam;//cout << "dwProcId:" << dwProcId << " pInfo->dwProcessId:" << pInfo->dwProcessId << endl;if (dwProcId == pInfo->dwProcessId){HWND p = GetParent(hWnd);HWND ph = GetParent(p);if (ph != 0) {pInfo->hWnd = ph;return FALSE;}}return TRUE;
}
HWND MainController::GetWndHwnd(char *strExeName)
{PROCESSENTRY32 pe32;//在使用这个结构前,先设置它的大小pe32.dwSize = sizeof(pe32);//给系统内所有的进程拍个快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap == INVALID_HANDLE_VALUE){return NULL;}//遍历进程快照,轮流显示每个进程的信息BOOL bMore = ::Process32First(hProcessSnap, &pe32);while (bMore){char* str = QString::fromStdWString(pe32.szExeFile).toLocal8Bit().data();if (strcmp(str, strExeName) == 0){HWND game_window_hwnd = GetProcessMainWnd(pe32.th32ProcessID);if (NULL != game_window_hwnd){::CloseHandle(hProcessSnap);return game_window_hwnd;}}bMore = ::Process32Next(hProcessSnap, &pe32);}//不要忘记清除掉snapshot对象::CloseHandle(hProcessSnap);return NULL;
}HWND MainController::GetProcessMainWnd(DWORD dwProcessId)
{WNDINFO wi;wi.dwProcessId = dwProcessId;wi.hWnd = NULL;EnumWindows(MyEnumProc, (LPARAM)&wi);return wi.hWnd;
}

pro 文件 -》LIBS +=User32.LIB

扫码有惊喜:

Qt 守护进程,保活相关推荐

  1. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  2. 探讨一种新型的双进程守护应用保活

    探讨一种新型的双进程守护应用保活方法 (转载请声明出处:http://blog.csdn.net/andrexpert/article/details/53485360) APP保活系列(最高支持到A ...

  3. 【Android 进程保活】应用进程拉活 ( 双进程守护保活 )

    文章目录 一. 双进程守护保活原理 二. 双进程守护保活完整源码 1.AIDL 接口 2.本地前台服务 Service 3.远程前台服务 Service 4.清单配置 5.启动两个服务 5.执行效果 ...

  4. 【docker系列】容器自启动与守护进程停止后容器保活

    本文为大家介绍容器自启动以及docker 守护进程挂掉或者docker升级的情况下,如何保证容器服务的正常运行.主要包含三个部分内容 文章目录 一.守护进程开机自启 二.容器自启动 重启策略说明 三. ...

  5. Android进程保活方案

    自己曾经也在这个问题上伤过脑经,前几日刚好有一个北京的哥们在QQ说在做IM类的项目,问我进程保活如何处理比较恰当,决定去总结一下,网上搜索一下进程常驻的方案好多好多,但是很多的方案都是不靠谱的或者不是 ...

  6. linux怎么监控守护进程,linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  7. Android 进程保活手段分析

    如何进行进程保活,首先我们应该先分析一下进程被杀死的原因开始 Android进程被杀死的场景分析: 从 Android 的进程被杀死的场景分析,查看被杀死的原因 一.Android手机的进程回收策略 ...

  8. Android安卓进程保活(二)

    Android进程保活·设置前台Service,提升App进程优先级 Android进程 此文章代码Github上有提交:https://github.com/NorthernBrain/proces ...

  9. Android 系统(271)---进程、守护进程的实现及进程拉活

    进程.守护进程的实现及进程拉活 1,概念 1)守护进程(Daemon) 是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某些任务.android中守护进程的实现主要由Service来完成. ...

最新文章

  1. ubuntu18下配置VS Code
  2. 更新日志 - fir.im「高级统计」功能上线
  3. 【代码笔记】iOS-播放从网络上下载的语音
  4. java 监听 变量_[Java学习小记]使用PropertyChangeSupport来监听变量的变化
  5. Python匿名函数——lambda表达式
  6. 基于AliOS Things玩转智能语音
  7. 路由器功能 后台管理 各功能 介绍
  8. java hashcode 例子_Java UUID hashCode()用法及代码示例
  9. 【codevs2287】火车站,第一个A掉的钻石题(迟来的解题报告)
  10. 数组中相同元素 java_如何在一维数组中查找某重复元素,并输出其位置?用java实现...
  11. Hadoop 集群的基准测试
  12. Java URLDecoder和URLEncoder
  13. python实现Pandas电话数据分析
  14. 在iPhone任何界面截图完整图文教程
  15. android抓trace工具,Android性能优化工具之TraceView
  16. 对其他小组的评价和建议
  17. 用PHP查看微信撤回的消息,[笔记]使用itchat监听微信撤回消息
  18. sodo与visodo的日常使用
  19. 电脑突然没有网络,发现电脑无法打开WiFi列表,打开设备管理器,发现intel(R)wireless-ac 9462感叹号
  20. python coding style guide 的快速落地实践

热门文章

  1. WINMGMT.EXE程式错误解决方法
  2. 前端朋友出去问到的面试题 2020-10-9
  3. 程序员懂不懂计算机硬件配置清单,你还不懂硬盘,内存和CPU的关系 ?(程序员入门)...
  4. 我的位置的特殊服务器,场景名:我的门派我做主 服务器:书写 特殊:1.1修身养性...
  5. 我对未来充满了向往——我们不必刻意去追求一种诗意化的生活,但我们完全可以让生活充满诗意
  6. team网卡配置_如何通过网卡Team增强服务器网络连接可靠性
  7. antV x6 开发流程图实例
  8. 数据结构 kmp字符串匹配_用动画解释 KMP 算法
  9. JAVA游戏有坐骑过沙漠的_刺激战场:玩家建议增加4个专属坐骑,海岛毛驴、沙漠骆驼!...
  10. 人文大数据及其在数字人文领域中的应用