Не работает чтение входного потока QProcess

233
09 мая 2018, 04:11

Предположим, есть программа, которая во время выполнения пишет лог в стандартный поток вывода, например такая:

//logger.cpp
#include <iostream>
#include <windows.h>
int main ()
{
    int i = 0;
    while (i < 10)
    {
        i++;
        std::cout<<"Log string\n";
        Sleep (500);
    }
return 0;
}

Я пишу программу на Qt, которая запускает logger.exe и пишет лог в QTextEdit, то есть как только logger.exe печатает строку, она должна появиться в QTextEdit. Я нашел два способа написать такую программу, однако оба не работают.

Первый способ, используя потоки:

//MainWindow.h
class MainWindow : public QMainWindow, public QThread
{
Q_OBJECT
private:
    QProcess logger_proc;
...
}
//MainWindow.cpp
MainWindow::MainWindow()
{ 
    QString path = QCoreApplication::applicationDirPath();
    path.append("/logger.exe");
    logger_proc.start(path);
    this.start();
}
void MainWindow::run()
{
    while (is_run())
    {
        char* buf = logger_proc.readAllStandardOutput().data();
        QString log = QString(buf);
        ui->text_field.append(log);// (1)
    }
    char* buf = logger_proc.readAllStandardOutput().data();
    QString log = QString(buf);
    ui->text_field.append (QString("After logger stops"));
    ui->text_field.append(log);// (2)
}
bool MainWindow::is_run() return (logger_proc.state()==QProcess::Running);

Проблема в том, что (1) всегда печатает пустую строку, пока программа не завершится, а после этого (2) печатает все, что logger.exe за это время напечатал. При замене readAllStandardOutput на readLine ничего не меняется.

Второй способ, используя сигналы и слоты:

MainWindow::MainWindow()
{
    QString path = QCoreApplication::applicationDirPath();
    path.append("/logger.exe");
    connect (&logger_proc, SIGNAL (readyReadStandardOutput()),
            this, SLOT (on_ready_read()));
    logger_proc.start(path);
    this.start();
}
//signal
void MainWindow::on_ready_read()
{
    //printing to textfield
}

Здесь наблюдается схожая проблема: слот on_ready_read срабатывает только после завершения logger.exe. Что я делаю не так?

READ ALSO
Нарисовать дугу в QGraphicsItem

Нарисовать дугу в QGraphicsItem

Есть класс class Edge : public QGraphicsItem, в котором реализовано рисование стрелок от одной вершины (Node) до другой (скрин ниже)Теперь необходимо добавить...

221
Поиск в текстовом файле предложений с заданной подстрокой

Поиск в текстовом файле предложений с заданной подстрокой

У меня получилось сделать поиск подстроки в строке, но в предложении не получаетсяКак сделать поиск в предложении? (Visual Studio 2010)

244
Ключ - Значение в бинарном дереве

Ключ - Значение в бинарном дереве

Есть бинарное дерево

189