![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Gordey |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет.
Помогите пожалуйста наладить перехват stdout консольного приложения. Использую QT 4.6.3 и Microsoft Visual Studio 2008. Задача: из Qt GUI запустить консольное приложение, перехватить его стандартный поток ввода/вывода и вывести перехваченные данные в элемент QTextEdit. Консольное приложение в цикле валит в поток вывода строки Value: 1 Value: 2 Value: 3 и т.д.
В Qt GUI при нажатии на кнопку создается отдельный поток.
При создании потока запускаем процесс с консольным приложением. При получении сигнала readyReadStandardOutput() отправляем считанные данные родительскому приложению.
В Qt GUI получаем посылку с данными и выводим ее в QTextEdit.
Проблема в том, что при перехвате потока ввода/вывода и выводе данных в QTextEdit происходит залипание Qt GUI. То есть я практически ничего не могу сделать с родительским окном. Как можно решить данную проблему? Как избавиться от залипания QT окна? При решении проблемы изменять код консольного приложения нельзя , нужно решить задачу другими способами. PS: Прикладываю тестовые проекты приложений. Так как проекты тестовые строго не судите за код… Обработки завершения процессов и потоков я не делал. Для распаковки архива с примерами удалите ".txt". Сообщение отредактировал Litkevich Yuriy - 1.7.2010, 21:39
Причина редактирования: пользуйся тэгом code
Прикрепленные файлы
|
|
|
Gordey |
![]()
Сообщение
#2
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
читай по форуму темы типа "потоки и сигналы", чтобы разобраться в каком конкретно потоке исполняется слот и т.п.
П.С. вопрос не в первый раз поднимается. |
|
|
Gordey |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
читай по форуму темы типа "потоки и сигналы", чтобы разобраться в каком конкретно потоке исполняется слот и т.п. П.С. вопрос не в первый раз поднимается. Да вроде бы все перерыл. Отчаявшись решил вот у гуру спросить. Если ты знаешь решение проблемы уж подскажи пожалуйста, а не отсылай в далекие дали. Я там уже был, но не встретил того что мне нужно. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
яб для начала, отправлял бы всё в отладочную консоль (с помощью qDebug), вместо отображения в виджете. тут можно было бы сразу сказать тормозит ли виджет от потока данных или всё таки проблемы с потоками выполнения кода.
|
|
|
Gordey |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
яб для начала, отправлял бы всё в отладочную консоль (с помощью 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 |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Но такой вариант мне не подходит так как консольное приложения я изменить не могу. а зачем ты в него вообще полез, если оно неизменяемое? Про него и забудь.Видимо для TextEdit это слишком большой темп поступления данных. Можно попробовать буферировать его, хотя я сомневаюсь, что это поможет. Скорее всего придётся менять сам виджет. |
|
|
Gordey |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Gordey |
![]()
Сообщение
#10
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Gordey |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Неужто здесь на форуме нет гуру способных помочь?
|
|
|
Алексей1153 |
![]()
Сообщение
#12
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Если я комментирую вывод информации в виджет, то тормоза пропадают. void MainWindow::setOutput(const QString &msg) { // ui->plainTextEdit->insertPlainText(msg); } а если накапливать данные в std::vector<char> , а закидывать их с контрол не чаще чем, скажем, раз в 250 мс ? Причём, если очередное обновление запоздало, то основной процесс пускай подпинывает обновление контрола из вектора по таймеру |
|
|
inviZ |
![]()
Сообщение
#13
|
Студент ![]() Группа: Новичок Сообщений: 16 Регистрация: 5.6.2010 Пользователь №: 1781 Спасибо сказали: 4 раз(а) Репутация: ![]() ![]() ![]() |
Gordey, может попробуешь QPlainTextEdit? Он попроще. Все-таки QTextEdit достаточно сложный с кучей плюшек всяких и поэтому тормозной.
|
|
|
Gordey |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Gordey, может попробуешь QPlainTextEdit? Он попроще. Все-таки QTextEdit достаточно сложный с кучей плюшек всяких и поэтому тормозной. Пробовал уже. На первый взгляд никаких изменений не увидел. Если я комментирую вывод информации в виджет, то тормоза пропадают. void MainWindow::setOutput(const QString &msg) { // ui->plainTextEdit->insertPlainText(msg); } а если накапливать данные в std::vector<char> , а закидывать их с контрол не чаще чем, скажем, раз в 250 мс ? Причём, если очередное обновление запоздало, то основной процесс пускай подпинывает обновление контрола из вектора по таймеру И так уже пробовал. Не помогает. Посылки приходят уже большого размера. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
я склоняюсь к тому, что при большом темпе поступления данных, в Qt будут проблемы. Т.к. вопрос о медленной отрисовке шрифтов в Qt уже не однократно поднимался.
Могу ещё для эксперимента несколько идей подкинуть: 1) обрамлять вставку данных в виджет функцией setUpdatesEnabled(bool) 2) задать виджету фиксированный размер, чтобы не заставлять компоновщик обсчитывать геометрию. |
|
|
Gordey |
![]()
Сообщение
#16
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 29.1.2009 Пользователь №: 516 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
я склоняюсь к тому, что при большом темпе поступления данных, в Qt будут проблемы. Т.к. вопрос о медленной отрисовке шрифтов в Qt уже не однократно поднимался. Могу ещё для эксперимента несколько идей подкинуть: 1) обрамлять вставку данных в виджет функцией setUpdatesEnabled(bool) 2) задать виджету фиксированный размер, чтобы не заставлять компоновщик обсчитывать геометрию. Спасибо за идеи. Попробую. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 12.7.2025, 11:58 |