您当前的位置: 首页 >  qt

龚建波

暂无认证

  • 3浏览

    0关注

    310博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt+Win32进行简单的多进程管理

龚建波 发布时间:2021-09-01 01:01:14 ,浏览量:3

项目需要将算法放到独立的进程运行,一来避免了算法不稳定导致主程序崩溃,二来避免了多个算法库的依赖冲突。主程序和子程序之间可用 Socket、共享内存、管道等方式进程交互,复杂的也可以上 RPC 框架。

本来首先想到的是使用 QProcess 来启动子进程,但是启动之后想要结束或者是判断进程状态属实不方便,索性直接全用 Win32 的接口来操作。由于需求简单,只是一个主程序对应多个子进程的形式,所以也不需要设计什么进程调度,只需要启动、关闭和检测进程运行状态。分别查找对应的接口:

首先是启动进程,百度到主要有四种接口,参照:https://blog.csdn.net/qq_43812868/article/details/108188987,为了方便创建进程时拿到对应的句柄,没用 CreateProcess,选择了 ShellExecuteEx,大致如下:

    //初始化
    SHELLEXECUTEINFOW se_info = { 0 };
    //memset(&se_info, 0x00, sizeof(SHELLEXECUTEINFOW));
    //in.required.此结构体字节大小
    se_info.cbSize = sizeof(SHELLEXECUTEINFOW);
    //in.SEE_MASK_NOCLOSEPROCESS用于指示hProcess成员接收到进程句柄。
    se_info.fMask = SEE_MASK_NOCLOSEPROCESS;
    //in.optional.父窗口的句柄,用于显示系统在执行此功能时可能产生的任何消息框。该值可以为NULL。
    //se_info.hwnd = NULL;
    //in.optional.要执行的动作,open打开指定lpFile文件,runas管理员身份启动应用程序
    se_info.lpVerb = L"open";
    //in.以空值结尾的字符串的地址
    se_info.lpFile = reinterpret_cast(info_path.utf16());
    //in.optional.执行参数
    se_info.lpParameters = reinterpret_cast(info_arg.utf16());
    //in.optional.工作目录,为NULL则使用当前目录
    //se_info.lpDirectory = NULL;
    //in.required.SW_HIDE隐藏该窗口并激活另一个窗口,打开的进程不会显示窗口
    //因为hide不显示窗口,测试/调试时可以用SW_SHOW
    se_info.nShow = info.visible ? SW_SHOW : SW_HIDE;
    //out.如果设置了SEE_MASK_NOCLOSEPROCESS并且ShellExecuteEx调用成功,它将把该成员设置为大于32的值。
    //如果函数失败,则将其设置为SE_ERR_XXX错误值,以指示失败的原因。
    //se_info.DUMMYUNIONNAME;
    //out.valid when SEE_MASK_NOCLOSEPROCESS 新启动的应用程序的句柄,如果未启动则为NULL
    //se_info.hProcess;

    qDebug()            
关注
打赏
1654961040
查看更多评论
0.0857s