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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Взаимодействие с запущенным процессом:читается не весь stdout  (Прочитано 1809 раз)
nightwalker
Гость
« : Октябрь 13, 2011, 15:59 »

Добрый день

Мне требуется написать оболочку для консольной программы - сервера, слушающего сокет.
Код привожу ниже
Цитировать
class Shell : public QWidget
{
   Q_OBJECT
   
   private:
      
      QProcess *conProc; //процесс, в котором будет запущена консольная программа
      QTextEdit *txtOut;//текстовое поле, в котором будет отображаться выходная информация программы
      QLineEdit *txtIp;//текстовое поле, в котором можно задать IP
            
   public:
            
      Shell(QWidget *pwgt = 0) : QWidget(pwgt)
      {
         
         conProc = new QProcess(this);
         txtOut = new QTextEdit;
         txtIp = new QLineEdit("192.168.160.5");
         
         QLabel *lblIp = new QLabel("IP:");
         
         QPushButton *butStart = new QPushButton("Start");
         
         
         connect(txtIp,
               SIGNAL(returnPressed()),
               SLOT(slotReturnPressed())
               );
         connect(conProc,
               SIGNAL(readyReadStandardOutput()), this,
               SLOT(_slotDataOnStdout())
               );
         connect(conProc,
               SIGNAL(readyRead()), this,
               SLOT(_slotDataOnStdout())
               );
         connect(butStart, SIGNAL(clicked()), SLOT(slotReturnPressed()));
         
         //компоновка виджетов
         
         //горизонтальная
         QHBoxLayout *boxHLayout = new QHBoxLayout;
         boxHLayout->addWidget(lblIp);
         boxHLayout->addWidget(txtIp);
         boxHLayout->addWidget(butStart);
         //вертикальная
         QVBoxLayout *boxVLayout = new QVBoxLayout;
         boxVLayout->addWidget(txtOut);
         boxVLayout->addLayout(boxHLayout);
         setLayout(boxVLayout);
         
      }
      
         
   public slots:
      
      void _slotDataOnStdout()
      {   
         //считывание данных вывода программы и запись их в текстовое поле

         txtOut->append(conProc->readAllStandardOutput());
      }
      
      void slotReturnPressed()
      {
         QString exPath = "./PMY"; //путь до исполняемого файла консольной программы(будет задаваться из конфига)
         conProc->setProcessChannelMode(QProcess::SeparateChannels);
         conProc->setReadChannel( QProcess::StandardOutput );
         QStringList arguments;

         conProc->start(exPath);
         
      }
      
};

Проблема в том, что в TextEdit'e не отображается весь стандартный вывод запускаемого процесса, а только часть, до принятия соединения. (соединение с клиентом проходит, это точно). Если переключить ProcessChannelMode в ForwardedChannels, то ВЕСЬ вывод(с принятием соединения, и прочей информацией, которая должна выводиться) становиться виден.

Пожалуйста, помогите разобраться.

Есть вариант, конечно, читать свой stdout в режиме ForwardedChannels, и записывать в QTextEdit, но я новичок в Qt и не знаю, как это сделать
Записан
nightwalker
Гость
« Ответ #1 : Октябрь 17, 2011, 15:41 »

up
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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