Предположим, есть программа, которая во время выполнения пишет лог в стандартный поток вывода, например такая:
//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. Что я делаю не так?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей