当前位置: 首页 > 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.lqws.cn/news/184321.html

相关文章:

  • NoSQL之Redis哨兵
  • 攻击模型的恶意行为检测
  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 2025服装收银系统推荐:智能管理助力服装商家高效经营
  • 网络库libhv介绍
  • USB扩展器与USB服务器的2个主要区别
  • windows10搭建nfs服务器
  • 网络编程及原理(三)
  • MySQL数据库表设计与索引优化终极指南
  • GEE使用记录
  • React 基础入门笔记
  • Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
  • VR视频制作有哪些流程?
  • Kafka 快速上手:安装部署与 HelloWorld 实践(二)
  • HakcMyVM -TheWall
  • IDEA安装迁移IDEA配置数据位置
  • 使用 Python 构建并调用 ComfyUI 图像生成 API:完整实战指南
  • vscode自定义主题语法及流程
  • Java-IO流之打印流详解
  • C++算法训练营 Day10 栈与队列(1)
  • 车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
  • 【递归、搜索与回溯】专题三 穷举vs暴搜vs回溯vs剪枝
  • 靶场(十九)--靶场体会小白分享--Billyboss
  • echarts 用散点图实现象限图
  • MySQL账号权限管理指南:安全创建账户与精细授权技巧
  • 文件对话框
  • 如何理解 IP 数据报中的 TTL?
  • 关于事务的简介
  • python打卡训练营打卡记录day46
  • 【数据结构】_排序