一、实现多进程方式
通过命令行传参,进程启动时,不同的命令行参数执行不同的逻辑。
代码如下:
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;
}