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

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

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

Залипание можно убрать если после вывода строки поставить задержку 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;
}

Но такой вариант мне не подходит так как консольное приложения я изменить не могу.
Записан
BRE
Гость
« Ответ #16 : Июль 01, 2010, 22:20 »

Ну тогда дай время главному потоку разгребать все сообщения о пришедших сигналах и на вставку текста:
Код
C++ (Qt)
void ServerThread::output()
{
   msleep( 200 );
   QByteArray bytes = process->readAllStandardOutput();
   emit updateOutput(bytes);
}
 
Также можно складывать пришедшие данные в промежуточный буфер и когда соберется определенное количество данных отправлять их одним эмитом.

Думаю, стоит обратить внимание на класс QPlainTextEdit, он по-быстрее QTextEdit.
Записан
Gordey1978
Гость
« Ответ #17 : Июль 02, 2010, 05:56 »

Ну тогда дай время главному потоку разгребать все сообщения о пришедших сигналах и на вставку текста:
Код
C++ (Qt)
void ServerThread::output()
{
   msleep( 200 );
   QByteArray bytes = process->readAllStandardOutput();
   emit updateOutput(bytes);
}
 
Также можно складывать пришедшие данные в промежуточный буфер и когда соберется определенное количество данных отправлять их одним эмитом.

Думаю, стоит обратить внимание на класс QPlainTextEdit, он по-быстрее QTextEdit.
С msleep( 200 ) попробовал... не помогло :-(


Все попробовал. Ничего не помогло :-(
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #18 : Июль 02, 2010, 14:35 »

я бы дал идею не просто создать процесс-перехватчик запуском одного QProcess, а запустить второй QThread, в нем запускать QProcess, получать там данные дочернего приложения, и через BlockingQueuedConnection передавать в QTextEdit основной нити - так интерфейс гарантированно блокироваться не будет

у меня в приложении похожим образом работает "консоль" - основные действия выполняются фоновым QThread, из которого через блокирующее соединение вычислитель плюется сообщениями, и эти сообщения валятся в QTextEdit в основном треде

только вот QTextEdit при этом все сильно тормозит, он на добавлении строк медлееееееннннннныыыыыыййййй..... Грустный поэтому при полностью асинхронной работе дочернего приложения вполне возможна потеря части сообщений
« Последнее редактирование: Июль 02, 2010, 15:01 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Gordey1978
Гость
« Ответ #19 : Июль 02, 2010, 15:29 »

я бы дал идею не просто создать процесс-перехватчик запуском одного QProcess, а запустить второй QThread, в нем запускать QProcess, получать там данные дочернего приложения, и через BlockingQueuedConnection передавать в QTextEdit основной нити - так интерфейс гарантированно блокироваться не будет

у меня в приложении похожим образом работает "консоль" - основные действия выполняются фоновым QThread, из которого через блокирующее соединение вычислитель плюется сообщениями, и эти сообщения валятся в QTextEdit в основном треде

только вот QTextEdit при этом все сильно тормозит, он на добавлении строк медлееееееннннннныыыыыыййййй..... Грустный поэтому при полностью асинхронной работе дочернего приложения вполне возможна потеря части сообщений


А код отвечающий за перехват и работу через BlockingQueuedConnection не можешь выложить?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


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

код, отвечающий за перехват - это не мой код, это ваш код...
Записан

2^7-1 == 127, задумайтесь...
Gordey1978
Гость
« Ответ #21 : Июль 04, 2010, 08:11 »

Неужто здесь на форуме нет гуру способных помочь?
Записан
niXman
Гость
« Ответ #22 : Июль 04, 2010, 21:42 »

у меня подобная задача работает превосходно.
установи монитор событий на дескрипторе, например, epoll() или select()
Записан
niXman
Гость
« Ответ #23 : Июль 04, 2010, 22:14 »

только буферизацию на дескрипторе не забудь отключить Подмигивающий
Записан
Gordey1978
Гость
« Ответ #24 : Июль 05, 2010, 05:40 »

у меня подобная задача работает превосходно.
установи монитор событий на дескрипторе, например, epoll() или select()

Если это реализовывать на чистых С++ + WinAPI, то и у меня все работает отлично. А вот с QT не очень получается :-(
Записан
niXman
Гость
« Ответ #25 : Июль 05, 2010, 06:19 »

Цитировать
А вот с QT не очень получается :-(
а должно? Подмигивающий
Записан
Gordey1978
Гость
« Ответ #26 : Июль 05, 2010, 16:47 »

Цитировать
А вот с QT не очень получается :-(
а должно? Подмигивающий

Думаю, что способ есть :-)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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