What's the best way of implementation QProcess, which reading stdout and stderr in "real time"?

Go To StackoverFlow.com


This questions is often asked. Many recommend use readyReadStandardOutput for this purpose What's the best way of implementation QProcess, which reading stdout and stderr in "real time"? I want to add messages in DisplayEdit. What i must change in my code (you can see it below )? May be use QThread for writing in DisplayEdit? I've already the following code:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
#include <QCloseEvent>

MainWindow::MainWindow(QWidget *parent) :
    ui(new Ui::MainWindow)
    process = new QProcess(this);
    connect(process, SIGNAL(readyReadStandardOutput()),SLOT(slotDataOnStdout()));
    connect(process, SIGNAL(readyReadStandardError()), SLOT(slotProcessError()));
    connect(process, SIGNAL(error(QProcess::ProcessError)),SLOT(slotProcessError()));
    connect(process, SIGNAL(started()),SLOT(slotProcessStart()));
    connect(process, SIGNAL(finished(int)),SLOT(slotProcessFinish(int)));

    delete ui;

void MainWindow::on_EnterButton_clicked()
    QStringList args = ui->ArgsEdit->text().split(" ");
    QString cmd = ui->CommandEdit->text();
    process->start(cmd, args);


void MainWindow::slotDataOnStdout()
    qDebug() << "slotDataOnStdout";
    ui->DisplayEdit->append(process->readAllStandardOutput() + '\n');

void MainWindow::slotStderr()
    qDebug() << "std error";

void MainWindow::slotProcessError()
    qDebug() << "error";

void MainWindow::slotProcessStart()
    qDebug() << "start";

void MainWindow::slotProcessFinish(int exitCode)
    qDebug() << "finish: " << exitCode;
    QString str = process->readAllStandardOutput();
    qDebug() << str;

And i want to execude the binary file of countdown timer. The code of my timer (i have took it from clock reference:

#include <stdio.h>
#include <time.h>

void wait ( int seconds )
  clock_t endwait;
  endwait = clock () + seconds * CLOCKS_PER_SEC ;
  while (clock() < endwait) {}

int main ()
  int n;
  printf ("Starting countdown...\n");
  for (n=10; n>0; n--)
    printf ("%d\n",n);
    wait (1);
  printf ("FIRE!!!\n");
  return 0;
2012-04-03 20:34
by G-71
It helps to keep your questions separate, if only because you cannot accept 2 answers here - MSalters 2012-04-03 20:42


Looks mostly right. You did forgot to clean up the process, or think about what to do when the process isn't finished yet.

As for the timer, use the QTimer::timeout signal.

2012-04-03 20:45
by MSalters