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中已有的程序的清理工作。

0 0
原创粉丝点击