Всем привет.
Помогите пожалуйста наладить перехват stdout консольного приложения.
Использую QT 4.6.3 и Microsoft Visual Studio 2008.
Задача: из Qt GUI запустить консольное приложение, перехватить его стандартный поток ввода/вывода и вывести перехваченные данные в элемент QTextEdit.
Консольное приложение в цикле валит в поток вывода строки
Value: 1
Value: 2
Value: 3
и т.д.
#include <iostream>
int main(int argc, char* argv[])
{
for(int i =0; i != 1000000; ++i)
std::cout << "Value: " << i << std::endl;
return 0;
}
В Qt GUI при нажатии на кнопку создается отдельный поток.
process = new QProcess;
process->setProcessChannelMode(QProcess::MergedChannels);
connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(output()));
process->start("test_console.exe");
exec();
При создании потока запускаем процесс с консольным приложением. При получении сигнала readyReadStandardOutput() отправляем считанные данные родительскому приложению.
void ServerThread::output()
{
QByteArray bytes = process->readAllStandardOutput();
emit updateOutput(bytes);
}
В Qt GUI получаем посылку с данными и выводим ее в QTextEdit.
void MainWindow::setOutput(const QString &msg)
{
ui->textEdit->insertPlainText(msg);
}
Проблема в том, что при перехвате потока ввода/вывода и выводе данных в QTextEdit происходит залипание Qt GUI. То есть я практически ничего не могу сделать с родительским окном.
Как можно решить данную проблему? Как избавиться от залипания QT окна? При решении проблемы изменять код консольного приложения нельзя , нужно решить задачу другими способами.
Файлы проектов выложил на
Скачать test.rar с WebFile.RU