当前位置: 首页 > news >正文

【QT常用技术讲解】多线程执行后台命令行的两种方式(后台运行和返回打印信息)

前言

        QT调用后台命令行,通常有两种场景:执行命令,等待并获取返回结果;执行命令,让程序后台一直执行(孤儿进程),不需要获取命令返回的结果。以下是分享在国产信创桌面操作系统(麒麟kylin、统信UOS)下的解决方法。

功能讲解

1、执行命令,等待并获取返回结果

【QT常用技术讲解】多线程编程处理卡顿_qt 为文件读取移动到线程中处理就非常慢-CSDN博客

        在此篇文章中分享了调用后台ping命令,并获取结果的方法,在Linux系统中也是可以的,当我使用此代码执行需要后台一直运行的程序的时候,发现进程会被杀死,并报如下错误

QProcess: Destroyed while process ("bash") is still running.

主要原因是线程资源被回收导致执行的进程被杀死。做了一些小改动尝试,还是报如下错误:

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QProcess(0x1f2fc60), parent's thread is QThread(0x1eea6b0), current thread is ThreadShellCmd(0x1f2bd40)

存在父子进程的问题(其实第三方程序已经创建成功了,不确定是否稳定,所以另外写代码来实现了)。

2、执行命令,让程序后台一直执行

需要使用QProcess::startDetached()对进程进行完全分离即可。代码如下所示

//threadNohupCmd.h
#ifndef THREADNOHUPCMD_H
#define THREADNOHUPCMD_H#include <QThread>
#include <QString>
#include <QProcess>class ThreadNohupCmd : public QThread
{Q_OBJECT
public:explicit ThreadNohupCmd(const QString &param,QObject *parent = nullptr) ;~ThreadNohupCmd();protected:void run() override;
signals:void callback(const QString result);private:QString m_param;
};#endif // THREADNOHUPCMD_H
//threadNohupCmd.cpp
#ifndef THREADNOHUPCMD_CPP
#define THREADNOHUPCMD_CPP#include "threadNohupCmd.h"
#include <QDebug>ThreadNohupCmd::ThreadNohupCmd(const QString &param,QObject *parent) : QThread(parent),m_param(param) {}ThreadNohupCmd::~ThreadNohupCmd() {
}void ThreadNohupCmd::run(){QString cmd = m_param;QProcess process;process.setProcessChannelMode(QProcess::MergedChannels);process.startDetached("bash", QStringList() << "-c" << cmd);emit callback("[success] 已后台执行");
}#endif // THREADNOHUPCMD_CPP

调用方式与1是一样的。

http://www.xdnf.cn/news/904735.html

相关文章:

  • 【Linux】grep 命令详解及使用示例:搜索匹配指定模式的文本行
  • 【JJ斗地主-注册安全分析报告】
  • 20250606-C#知识:匿名函数、Lambda表达式与闭包
  • 动态IP与静态IP:数字世界的“变脸术”与“身份证”
  • CSS 轮廓(Outline)与边框(Border)的深度解析
  • 【Zephyr 系列 12】BLE + NVS + 低功耗融合实战:打造可配置蓝牙信标系统
  • Codeforces EDU Round 179 A~D
  • 【自动驾驶避障开发】如何让障碍物在 RViz 中‘显形’?呈现感知数据转 Polygon 全流程
  • AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量
  • C# 日志管理功能代码
  • Electron Fiddle使用笔记
  • ComfyUI 中如何使用 Depth ControlNet SD1.5
  • 嵌入式学习笔记-freeRTOS taskENTER_CRITICAL(_FROM_ISR)跟taskEXIT_CRITICAL(_FROM_ISR)函数解析
  • 金蝶云星空·旗舰版与吉客云:赋能电商企业业财一体化
  • 软件功能模块归属论证方法
  • Python训练营打卡 Day46
  • 气体绝缘开关设备局部放电监测中PRPD和PRPS图谱的深度分析
  • 影楼精修-AI衣服祛褶皱算法解析
  • 【动手学深度学习】3.1. 线性回归
  • 集成电路设计:从概念到实现的完整解析优雅草卓伊凡
  • 【配置 YOLOX 用于按目录分类的图片数据集】
  • coze智能体后端接入问题:
  • 视觉分析在人员行为属性检测中的应用
  • 未来十年 Python 学习路线全解析
  • 为什么说数列是特殊的函数
  • NLP学习路线图(二十九):BERT及其变体
  • Python Pandas库超详细教程:从入门到精通实战指南
  • 使用MinIO搭建自己的分布式文件存储
  • 打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库
  • 【Linux】Linux基础指令3