В основном потоке приложения с графическим интерфейсом я запускаю QProcess другого приложения с графическим интерфейсом, которое со временем будет записывать некоторые сообщения в стандартный вывод с помощью fputs (). Проблема в том, что через некоторое время приложение с графическим интерфейсом, запущенное с QProcess, замерзнет, потому что его вывод не используется родителем. Я знаю, что это проблема, потому что, если я запускаю QProcess с аргументом QIODevice :: NotOpen или QIODevice :: Unbuffered, он не застрянет, но вывод никогда не будет достигнут.
Я попытался соединить сигналы readyRead, readyReadStandardError, readyReadStandardOutput подпроцесса со слотом в родительском слоте, но по некоторым причинам сигналы никогда не излучаются. Я также сбрасываю стандартный вывод после каждой записи.
У меня вопрос, как заставить QProcess отправлять некоторые данные в режиме реального времени, не закрывая их?
Соединение сигналов, (T- это обертка для QProcess):
process->setWorkingDirectory(workingDir);
process->start(prog, argumentsList);
process->waitForStarted();
T* reciver = new V8QProcess(process);
QObject::connect(process, &QProcess::readyRead, reciver, &V8QProcess::OnMessageRecieved);
QObject::connect(process, &QProcess::readyReadStandardError, reciver, &V8QProcess::OnMessageRecieved);
QObject::connect(process, &QProcess::readyReadStandardOutput, reciver, &V8QProcess::OnMessageRecieved);
Код подпроцесса, который будет входить в стандартный вывод:
QByteArray bytes = LogMsg::getDisplayable(logMsg, 0).toUtf8();
fputs(bytes.constData(), stdout);
fflush(stdout);
Код полученного сообщения:
if (!p) { // p is the QProcess
return;
}
QByteArray output;
output.append(p->readAllStandardError()).append(p->readAll());
QString message = QString::fromStdString(output.toStdString());
Этот подход работает при запуске сценария оболочки или другой простой программы.