Qt-Windows系统进程间通信实践 - 进程优先级

前言

本文记录Qt应用程序使用QProcess配合udp通信协议实现进程间通信IPC实践。程序运行界面如下

实现功能

  1. 主控端可选择能够进行相互连接的子程序
  2. 子程序可由主控端进行踢出或者设置CPU运行优先级
  3. 可选择是否在所有子程序退出后主控端一同退出
  4. 可选择是否在任何一个子程序退出后所有其他子程序与主控端全部退出
  5. 所有子程序均可根据运行时传入端口号参数决定是否加入udp监听
  6. 子程序端口号根据主控端监听端口自动加1

运行流程

  1. 程序启动后,可手动添加支持udp连接的客户端子程序
  2. 添加成功后客户端会发送一条启动的udp消息,服务端收到并展示。
  3. 服务端对客户端的“移除”与变更进程优先级操作均通过udp包发送给客户端,udp包中包含有目标程序所包含的端口号(简单起见以此来区分哪个客户端应该对此包做出回应)。
  4. 客户端主动退出后会给服务端发送指定格式udp包,服务端收到后根据配置决定单独退出此程序或者全部退出。

UDP数据包格式分隔符为###

示例1:SERVERMSG###TERMINATE###[MSGCONTENT]
SERVERMSG: 服务端发往客户端的信息
TERMINATE: 表示执行关闭程序操作
MSGCONTENT: 表示此次操作需携带的数据(可空)

示例2:SERVERMSG###PRIORITY###2
SERVERMSG: 服务端发往客户端的信息
PRIORITY: 表示设置客户端进程的优先级
2: 设置优先级为2(HIGH_PRIORITY_CLASS:High,高优先级类)

示例3:CLIENTMSG###CopyCoinFlip:9001 started
CLIENTMSG: 客户端发往服务端的信息
CopyCoinFlip:9001 started: 通知型信息,消息主体为监听9001端口的程序CopyCoinFlip启动了

可以看到DebugView中捕获了win32程序的调试信息

第二行setPriority 2为设置的优先级代码,1为SetPriorityClass执行的布尔型返回值。对应源码为

对应任务管理器也可以显示到相同的结果

压缩包中只包含两个支持本udp通信协议的客户端子程序,分别为CopyCoinFlip.exe 和 MyDockButtonDemo.exe 。

这两个exe可单独运行,也可由CommandDashBoard经过添加程序进行启动,经由CommandDashboard启动的应用会接收到由Qprocess启动追加的端口参数,客户端在识别到参数后启动自身的udp连接。

启动udp后还需要实现udp客户端的其他功能,例如发送数据、处理服务端发送消息、重写关闭窗体事件等,如下

项目源码

Qt-Windows系统进程间通信实践.7z》 提取码:fpqj

理论上,所有实现了上述方法的客户端都可以作为CommandDashboard的子程序运行。