crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Помогите пожалуйста наладить перехват stdout консольного приложения.
Gordey
  опции профиля:
сообщение 1.7.2010, 20:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


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

PS: Прикладываю тестовые проекты приложений. Так как проекты тестовые строго не судите за код… Обработки завершения процессов и потоков я не делал. Для распаковки архива с примерами удалите ".txt".

Сообщение отредактировал Litkevich Yuriy - 1.7.2010, 21:39
Причина редактирования: пользуйся тэгом code

Прикрепленные файлы
Прикрепленный файл  test.rar.txt ( 40.41 килобайт ) Кол-во скачиваний: 186
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gordey
  опции профиля:
сообщение 1.7.2010, 21:26
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


Дополнительно выложил файлы проектов на webfile.ru

Скачать test.rar с WebFile.RU
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.7.2010, 21:44
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

П.С. вопрос не в первый раз поднимается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gordey
  опции профиля:
сообщение 1.7.2010, 22:03
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 1.7.2010, 22:44) *
читай по форуму темы типа "потоки и сигналы", чтобы разобраться в каком конкретно потоке исполняется слот и т.п.

П.С. вопрос не в первый раз поднимается.


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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.7.2010, 22:28
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


яб для начала, отправлял бы всё в отладочную консоль (с помощью qDebug), вместо отображения в виджете. тут можно было бы сразу сказать тормозит ли виджет от потока данных или всё таки проблемы с потоками выполнения кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gordey
  опции профиля:
сообщение 2.7.2010, 6:08
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 1.7.2010, 23:28) *
яб для начала, отправлял бы всё в отладочную консоль (с помощью qDebug), вместо отображения в виджете. тут можно было бы сразу сказать тормозит ли виджет от потока данных или всё таки проблемы с потоками выполнения кода.


Если я комментирую вывод информации в виджет, то тормоза пропадают.

void MainWindow::setOutput(const QString &msg)
{
// ui->plainTextEdit->insertPlainText(msg);
}


Залипание можно убрать если после вывода строки поставить задержку Sleep(1).

Старый вариант:
int main(int argc, char* argv[])
{
for(int i =0; i != 1000000; ++i)
std::cout << "Value: " << i << std::endl;

return 0;
}

Новый вариант:
int main(int argc, char* argv[])
{
for(int i =0; i != 1000000; ++i)
{
std::cout << "Value: " << i << std::endl;
Sleep(1);
}

return 0;
}

Но такой вариант мне не подходит так как консольное приложения я изменить не могу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.7.2010, 11:50
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Gordey @ 2.7.2010, 10:08) *
Но такой вариант мне не подходит так как консольное приложения я изменить не могу.
а зачем ты в него вообще полез, если оно неизменяемое? Про него и забудь.

Видимо для TextEdit это слишком большой темп поступления данных. Можно попробовать буферировать его, хотя я сомневаюсь, что это поможет. Скорее всего придётся менять сам виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gordey
  опции профиля:
сообщение 2.7.2010, 15:31
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 2.7.2010, 12:50) *
Видимо для TextEdit это слишком большой темп поступления данных. Можно попробовать буферировать его, хотя я сомневаюсь, что это поможет. Скорее всего придётся менять сам виджет


А что значит менять? Как его можно изменить чтобы он быстрее работал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.7.2010, 16:22
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Gordey @ 2.7.2010, 19:31) *
А что значит менять?
на какой-нибудь другой виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Gordey
  опции профиля:
сообщение 2.7.2010, 17:29
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 29.1.2009
Пользователь №: 516

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 2.7.2010, 17:22) *
TextEdit


Ааа... Я уже разные перепробовал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 17:37