Russian Qt Forum
Май 22, 2024, 03:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Помогите пожалуйста наладить перехват stdout консольного приложения.  (Прочитано 13897 раз)
Gordey1978
Гость
« : Июль 01, 2010, 20:41 »

Всем привет.
Помогите пожалуйста наладить перехват 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
« Последнее редактирование: Июль 01, 2010, 21:47 от Gordey1978 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Июль 01, 2010, 20:52 »

А вы проверьте, действительно ли QProcess работает в другом потоке?

---

что-то у меня скачался архив в котором только main.cpp
« Последнее редактирование: Июль 01, 2010, 20:56 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Gordey1978
Гость
« Ответ #2 : Июль 01, 2010, 20:55 »

А вы проверьте, действительно ли QProcess работает в другом потоке?

А как проще проверить?
Записан
BRE
Гость
« Ответ #3 : Июль 01, 2010, 20:55 »

Попробуй:
Код
C++ (Qt)
class ServerThread : public QThread
{
   Q_OBJECT
 
public:
  ServerThread();
 

Код
C++ (Qt)
ServerThread::ServerThread() : QThread( 0 ), process(0)
{
moveToThread( this );
}
 
Записан
BRE
Гость
« Ответ #4 : Июль 01, 2010, 20:56 »

А как проще проверить?
Посмотреть, что выводит QThread::currentThreadId()
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Июль 01, 2010, 20:59 »

Шо ви выкладываете хрень какую-то в аттач? То в *.zip ошибка в архиве, то в *.rar один только main.cpp!?? У меня одного так?
Записан

ArchLinux x86_64 / Win10 64 bit
Gordey1978
Гость
« Ответ #6 : Июль 01, 2010, 21:01 »

Шо ви выкладываете хрень какую-то в аттач? То в *.zip ошибка в архиве, то в *.rar один только main.cpp!?? У меня одного так?

Чета архивы портятся при добавлении. Сам обратно заказиваю, а они уже битые. Как выложить то?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Июль 01, 2010, 21:01 »

Ничо не должно бится.. Мож архиватор палёный? Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Gordey1978
Гость
« Ответ #8 : Июль 01, 2010, 21:03 »

Попробуй:
Код
C++ (Qt)
class ServerThread : public QThread
{
   Q_OBJECT
 
public:
  ServerThread();
 

Код
C++ (Qt)
ServerThread::ServerThread() : QThread( 0 ), process(0)
{
moveToThread( this );
}
 


Не помогло. Залипание не ушло Грустный
Записан
Gordey1978
Гость
« Ответ #9 : Июль 01, 2010, 21:04 »

Ничо не должно бится.. Мож архиватор палёный? Улыбающийся

Да вроде проверенные :-) Сейчас еще попробую...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Июль 01, 2010, 21:06 »

Цитировать
Не помогло. Залипание не ушло Грустный
Проверьте ID-ы потоков: основного и процессного
Записан

ArchLinux x86_64 / Win10 64 bit
Gordey1978
Гость
« Ответ #11 : Июль 01, 2010, 21:10 »

А как проще проверить?
Посмотреть, что выводит QThread::currentThreadId()

На разных.
h1   0x00000e40    void *
h2   0x00000d60    void *

void ServerThread::run()
{
   Qt::HANDLE h2 = QThread::currentThreadId();
}

void MainWindow::on_pushButton_clicked()
{
   Qt::HANDLE h1 = QThread::currentThreadId();
}


Записан
Gordey1978
Гость
« Ответ #12 : Июль 01, 2010, 21:16 »

Вот еще попытка выложить проекты
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Июль 01, 2010, 21:21 »

Все-равно косяки с архивами.. Как вариант - перед аттачем архивов - уберите расширение *.txt . может поможет.
Записан

ArchLinux x86_64 / Win10 64 bit
Gordey1978
Гость
« Ответ #14 : Июль 01, 2010, 21:23 »

Так как ничего не вышло с архивами дополнительно закачал файлы на webfile.ru

Скачать test.rar с WebFile.RU
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.363 секунд. Запросов: 22.