I need to call an executable, from my QT application, monitor the output and then display the out put in a text browser.
The executable I call from my QT app will run for many hours (~12) and each time the executable spits something out to stdout, I need to parse the output to be able to monitor its progress, then display it all to the screen.
I did this below to start… which is a start… But it only displays the output to the window when the executable finishes, and I need it to update in real time… as well as parsing the output
Put new code in… Program runs, but nothing is ported to the screen, maybe I need to set the process to write to stdout? It will display every output when program is canceled or finishes… The whole function acts that way? Surely I am doing something silly…
btw the executable I am calling does not buffer output… when called from the command line it outputs as the program runs… Runs all except the finished SIGNAL bit…
New Code: (EDIT… Solution!)
monit::monit(QWidget *parent) :
QDialog(parent),
ui(new Ui::monit){
ui->setupUi(this);
r = new QProcess(this);
connect(r, SIGNAL(readyReadStandardError()), this, SLOT(updateError()));
connect(r, SIGNAL(readyReadStandardOutput()), this, SLOT(updateText()));
//connect(r, SIGNAL(started()), this, SLOT(updateExit()));
}
ProcChainMonitor::~ProcChainMonitor()
{
delete ui;
}
void ProcChainMonitor::on_buttonStart_clicked()
{
QString program = "prog";
QStringList arguments;
arguments << "arg";
r->setWorkingDirectory("dir");
r->start(program, arguments);
}
void ProcChainMonitor::updateError()
{
QByteArray data = r->readAllStandardError();
ui->textEdit->append(data);
if (r->exitStatus()!= NULL){
ui->textEdit->append("Exited");
ui->textEdit->append(QString::number(r->exitCode()));
}
}
void ProcChainMonitor::updateText()
{
QByteArray data = r->readAll();
ui->textEdit->append(data);
if (r->exitStatus()!= NULL){
ui->textEdit->append("Exited");
ui->textEdit->append(QString::number(r->exitCode()));
}
}
Advertisement
Answer
Look at https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe which will remove the buffering and cause you to get input almost immediately (YMMV, I haven’t tested this)