서브 프로세스가 출력을 생성 할 때 호출되는 신호 처리기를 설정하는 것이 좋습니다. 예 : readyReadStandardOutput
에 연결해야합니다.
그러면 하위 프로세스에서 입력을 요구하고 원하는 입력을 보낼 때이를 식별 할 수 있습니다. 이 작업은 readSubProcess()
에서 완료됩니다. 다음으로
#include <QtCore>
#include "Foo.h"
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
Foo foo;
qDebug() << "Starting main loop";
app.exec();
}
MAIN.CPP는 서브 프로세스가 시작되고, 입력 체크. calculator
프로그램이 완료되면 주 프로그램도 종료됩니다. 서브 프로세스 계산기 간단한 스크립트 용 Foo.h
#include <QtCore>
class Foo : public QObject {
Q_OBJECT
QProcess myprocess;
QString output;
public:
Foo() : QObject() {
myprocess.start("./calculator");
// probably nothing here yet
qDebug() << "Output right after start:"
<< myprocess.readAllStandardOutput();
// get informed when data is ready
connect(&myprocess, SIGNAL(readyReadStandardOutput()),
this, SLOT(readSubProcess()));
};
private slots:
// here we check what was received (called everytime new data is readable)
void readSubProcess(void) {
output.append(myprocess.readAllStandardOutput());
qDebug() << "complete output: " << output;
// check if input is expected
if (output.endsWith("type\n")) {
qDebug() << "ready to receive input";
// write something to subprocess, if the user has provided input,
// you need to (read it and) forward it here.
myprocess.write("hallo back!\n");
// reset outputbuffer
output = "";
}
// subprocess indicates it finished
if (output.endsWith("Bye!\n")) {
// wait for subprocess and exit
myprocess.waitForFinished();
QCoreApplication::exit();
}
};
};
사용된다. 출력이 생성되는 위치와 입력이 예상되는 위치를 볼 수 있습니다. 당신이 (예를 들면 GUI를 보여 다른 스레드/프로세스를 .... 관리) 주요 과정에서 다른 작업을 수행 할 필요가없는 경우
#/bin/bash
echo "Sub: Im calculator!"
# some processing here with occasionally feedback
sleep 3
echo "Sub: hallo"
sleep 1
echo "Sub: type"
# here the script blocks until some input with '\n' at the end comes via stdin
read BAR
# just echo what we got from input
echo "Sub: you typed: ${BAR}"
sleep 1
echo "Sub: Bye!"
는 쉬운 루프 이후에 단지 sleep
에서하는 것 하위 프로세스 생성 후 readSubprocess
과 같은 것입니다.
_ 이미 시도한 솔루션 중 일부를 시도했습니다. –
Signal과 Slot의 연결 : connect (process, SIGNAL (readyRead()), this, SLOT (readStdOut())); – Daud