Я не могу получить стандартный вывод для обновления в Qt - PullRequest
0 голосов
/ 14 ноября 2010

Мне нужно вызвать исполняемый файл из моего приложения QT, проследить за выводом, а затем отобразить вывод в текстовом браузере.

Исполняемый файл, который я вызываю из моего приложения QT, будет работать в течение многих часов (~12) и каждый раз, когда исполняемый файл выплевывает что-то на стандартный вывод, мне нужно проанализировать вывод, чтобы иметь возможность отслеживать его ход, а затем отобразить все это на экране.

Я сделал это ниже, чтобы начать ...который является началом ... Но он отображает вывод в окно только после завершения исполняемого файла, и мне нужно, чтобы он обновлялся в режиме реального времени ... а также анализирует вывод

Вставьте новый код... Программа запускается, но ничего не переносится на экран, может быть, мне нужно настроить процесс записи в стандартный вывод?Он будет отображать каждый вывод, когда программа отменяется или заканчивается ... Вся функция действует таким образом?Конечно, я делаю что-то глупое ...

кстати исполняемый файл, который я вызываю, не буферизует вывод ... при вызове из командной строки он выводит при запуске программы ... Запускает все, кроме завершенного бита SIGNAL...

Новый код: (РЕДАКТИРОВАТЬ ... Решение!)

 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()));
}

}

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Вы должны использовать класс QProcess.Прочитайте часть о связи по каналам https://doc.qt.io/archives/qt-4.7/qprocess.html

0 голосов
/ 14 ноября 2010

Посмотрите на https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe, который удалит буферизацию и приведет к тому, что вы получите вход почти сразу (YMMV, я не проверял это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...