【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是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deepallin

打个赏吧,三瓜两枣不嫌弃^_^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值