MFC 实现单进程运行
来源:互联网 发布:影视飞飞cms 编辑:程序博客网 时间:2024/05/21 17:28
最近在调试老板的相机系统程序, 我们使用进程间通信IPC, 用的是命名管道技术, 成功实现了两个进程之间的数据交互, 考虑到需要每次手工启动另一个辅助程序, 我们在主程序里面使用了, createprocess对他进行调用, 正常情况下, 程序运行完好, 主程序启动的时候, 顺便把子程序顺带给启动了, 主程序关闭的时候, 顺便把子程序也关闭了。
但是最近遇到一个比较蛋疼的情况, 就是当主程序非正常退出的时候, 子程序的资源是不会被正常释放的,也就是说子程序没有退出, 下次启动主程序的时候, 又会有一个新的子程序启动起来, 这样的情况, 对于我们使用socket通信时候, 是非常不乐意看到的。
我们想到了设计模式里面的单例模式, 每次只启动一个进程, 就像windows的任务管理器一样。在网上找了一下, 主要有这么两种思路:
1. 为我的进程绑定一个资源对象, 如一个文件, 进行运行就申请他, 那么下次新的进程来的时候, 申请不到这个资源, 就自动退出
2. 使用mutex 管理, 借助windows 的 createMutex 函数, 来实现。
我们参考了这个思路, 下面是实现代码:
BOOL Cserver_for_delcamApp::InitInstance(){ // 单例进程的实现 20160307 hmutex = CreateMutexA(nullptr, FALSE, "server_for_delcam"); int err = GetLastError(); if (err == ERROR_ALREADY_EXISTS){ CloseHandle(hmutex); hmutex = nullptr; return FALSE; } // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 // MFC 自动生成的框架代码 。。。。}
这时候, 我们启动这个程序多少次, 他都只有一个进程在OS中运行。 问题得到解决。
但是, 用这个方法还有另一个问题没有解决, 就是这个在os中运行着的程序, 无法再主程序退出的时候, 自动被退出了, 这是一个让人讨厌的问题。
于是我们想到, 可以在主程序启动的时候, 就直接先把os中的这个server子程序给结束掉, 然后在启动它, 这样不也可以实现单进程运行吗。 问题得到解决:
代码如下:
/************************************************************************//* 启动delcamServer process , 确保只有一个进程存在 *//************************************************************************/bool ConnectWithDelcam::startDelcamServerSubProcess_single(){ string clearbat = "/im server_for_delcam.exe"; ShellExecuteA(0, "open", "taskkill.exe", clearbat.c_str(), "", SW_HIDE); STARTUPINFOA sui = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; BOOL ret = CreateProcessA(nullptr, "server_for_delcam.exe", nullptr, nullptr, false, 0, nullptr, nullptr, &sui, &pi); if (!ret){ cerr << "启动子进程失败" << endl; return false; } hsubProcess = pi.hProcess; return true;}
实际上, 上述代码借助了批处理, 使用taskkill 实现对os中已有的程序的清理工作。
- MFC 实现单进程运行
- 【框架-MFC】MFC 实现单例进程,只允许一个程序运行
- MFC使用共享段实现单例进程
- 实现单实例运行
- MFC 单文档程序的运行过程
- MFC单例运行三种方式
- MFC 单例运行三种方式
- C# 限制软件单进程运行
- Shell实现多进程运行
- MFC MDI单窗口多标签实现
- MFC MDI单窗口多标签实现
- [Windows]MFC单文档实现菜单切换
- MFC+OpenGL单文档实现图形旋转
- OpenGL MFC单文档 实现轨迹球
- MFC 单文档工程 实现单文档多视图
- MFC SendMessage实现进程间通讯
- C#实现确保单进程类
- 守护进程的单实例实现
- Ubuntu 环境中搭建嵌入式交叉编译链方法
- 说说PADS中的ECO
- struct和typedef struct
- 复变函数
- Bias-Variance Tradeoff【转载】
- MFC 实现单进程运行
- 安装服务时遇到 System.BadImageFormatException: 未能加载文件或程序集
- Verify Preorder Serialization of a Binary Tree
- [iOS]实现抽象基类
- iOS 定位服务编程详解
- mac mysql忘记root密码
- 深入使用Spring(一)
- eclipse+SVN文件只显示版本号,不显示时间和作者解决办法
- MySQL存储引擎对比