当前位置: 首页 > 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是一样的。

相关文章:

  • API是什么意思?如何实现开放API?
  • 惊艳呈现:探索数据可视化的艺术与科学
  • 嵌入式开发之STM32学习笔记day21
  • 软件功能模块归属论证方法
  • C++中的概念(Concepts)
  • C++.OpenGL (11/64)材质(Materials)
  • Spring Boot 实现流式响应(兼容 2.7.x)
  • 【Redis】哨兵模式
  • 【C语言】统计孪生素数对高效解法
  • vsCode使用本地低版本node启动配置文件
  • 1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
  • 解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
  • 氛围编程时代来临:本地化智能分析破解老项目 AI 编程困局
  • 【Go语言基础【6】】字符串格式化说明
  • 保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
  • MySQL体系架构解析(二):MySQL目录与启动配置全解析
  • 命令行以TLS/SSL显式加密方式访问FTP服务器
  • for AC500 PLCs 3ADR025003M9903的安全说明
  • 【Algo】常见组合类数列
  • dify官方离线安装打包插件脚本,改造成ubuntu或者debain系统可用
  • 做进料加工在哪个网站上做/网推app怎么推广
  • 网站搜索排名高怎么做/哈尔滨最新
  • 山东泰山队深圳队/临沂seo整站优化厂家
  • 做微电网的公司网站/seo短视频入口引流
  • html5的网站设计/西安seo排名扣费
  • 洋桥网站建设公司/网站权重是怎么提升的