0
点赞
收藏
分享

微信扫一扫

QT多进程开发,管道通信

快乐小鱼儿_9911 2022-04-03 阅读 50
qtc++

一、实现多进程方式

        通过命令行传参,进程启动时,不同的命令行参数执行不同的逻辑。

        代码如下:

int main(int argc, char *argv[])
{
    QStringList argumentsList;
    {
        QApplication a(argc, argv);
        argumentsList = QCoreApplication::arguments();
    }

    if(argumentsList.count()>1 && argumentsList.at(1)=="start")
    {
        // 存在命令行参数,且第一个命令行参数为"start"
        QApplication a(argc, argv);
        ParentProcess obj;
        QPushButton myBtn;
        myBtn.show();
        QObject::connect(&myBtn,SIGNAL(clicked()),&obj,SLOT(sender()));

        return a.exec();
    }
    else
    {
        // 没有命令行参数
        cout << "Child Process: I am Ready!" << endl;
        std::string input;
        while(true)
        {
            getline(std::cin,input);
            if(!input.compare("quit"))
                break;
            cout << "From Child Process: " << input << endl;
        }
        cout << "Bye From Child Process!" << endl;
        return 0;
    }

    return 0;
}

一、进程间通信方法

(1)匿名管道,命名管道

(2)套接字socket

(3)system v ipc(消息队列、共享内存、信号量集)

        根据上面的代码段可以知道,启动的进程间存在父子关系,所以采用匿名管道的方式进行通信。创建如下一个类即可:

头文件内容:

#ifndef PARENT_PROCESS_H
#define PARENT_PROCESS_H
#include <QObject>
class QProcess;

class ParentProcess : public QObject
{
    Q_OBJECT
public:
    explicit ParentProcess(QObject *parent = 0);
    ~ParentProcess();
public slots:
    void sender();
    void receiver();
private:
    QProcess* myChildProcess;
    int count;
};

#endif // PARENT_PROCESS_H

源文件内容:

#include "ParentProcess.h"
#include <QProcess>
#include <QDebug>

ParentProcess::ParentProcess(QObject *parent) :
    QObject(parent)
{
    count = 0;
    myChildProcess = new QProcess(this);
    QObject::connect(myChildProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(receiver()));
    myChildProcess->setProcessChannelMode(QProcess::MergedChannels);
    QStringList argumentsList;
    argumentsList.push_back("start");
    myChildProcess->start("pipeTest.exe", argumentsList);
    if (!myChildProcess->waitForStarted())
        qDebug() << "Make failed:" << myChildProcess->errorString();
    else
        qDebug() << "Child Process Started. " << myChildProcess->readAll();
}

ParentProcess::~ParentProcess()
{
    myChildProcess->close();
    delete myChildProcess;
    myChildProcess = nullptr;
}

void ParentProcess::sender()
{
   if(count > 3)
       myChildProcess->write("quit\n");
   count++;
   myChildProcess->write("Nice to meet you!");
   myChildProcess->write((QString::number(count)+ "\n").toStdString().c_str());
}

void ParentProcess::receiver()
{
    char output[128];
    int ret = myChildProcess->readLine(output,127);
    qDebug() << ret;
    qDebug() << output;
}
举报

相关推荐

0 条评论