项目需要将算法放到独立的进程运行,一来避免了算法不稳定导致主程序崩溃,二来避免了多个算法库的依赖冲突。主程序和子程序之间可用 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()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?