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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess и консольные приложения  (Прочитано 15769 раз)
bond_e
Гость
« : Июль 03, 2007, 15:17 »

Когда я запускаю консольное приложение с помощью QProcess (функция start() ), для него не создается окно, т.е. приложение "не видно". Нельзя ли как-то разрешить эту ситуацию, т.к. информация, выводимая этим приложением, важна. ReadStandardOutput не срабатывает - ничего не передается
Можно правда запускать приложение с помощью startDetached() - тогда окно создается, но при этом нет возможности следить за процессом средствами QProcess: останавливать и перезапускать при необходимости
Записан
Emc
Гость
« Ответ #1 : Июль 03, 2007, 17:26 »

хмм должно работать
на сигнал readyReadStandardOutput ()  вешаешь слот с readAllStandardOutput ()
--------
лучше выложи код - скорей всего у тебя ошибка
Записан
Spicos
Гость
« Ответ #2 : Июль 04, 2007, 05:44 »

http://prog.org.ru/forum/htopic_4175_qprocess.html
Записан
bond_e
Гость
« Ответ #3 : Июль 04, 2007, 15:10 »

нет там ошибки - простая консольная програма, общающаяся с пользователем посредством gets/puts/printf например. в stdout напрямую ничего не идет - буферизуется, надо полагать. можно было бы конечно fflush этот буфер, но программа чужая, в ней ничего не поменяешь.
QProcess start() стартует процесс с параметром CREATE_NO_WINDOW (в windows), что и блокирует создание окна для консольных приложений.
cmd.exe тут ни при чем. разве что использовать cmd /c start proga.exe - но это не выход
Записан
Emc
Гость
« Ответ #4 : Июль 04, 2007, 20:26 »

если при запуске в cmd чужой программы (отдельно от твоей) она выкидывает сообщение в консоль -- то все должно работать (наличие/отсутствие консольных окон роли не играет, если нет - то ничем не вылечишь - обращайся к автору программы. Еще раз просьба выкладывай код, заниматься гаданием не очень интересно
Записан
Alex03
Гость
« Ответ #5 : Июль 05, 2007, 12:05 »

Проверьте что оно именно в stdout всё выплёвывает а не в stderr.
Записан
bond_e
Гость
« Ответ #6 : Июль 05, 2007, 16:40 »

хорошо, вот пример (работающий, можно скомпилить и запустить):

1. testcon.cpp - интерактивная консольная программа,  имитируюшая диалог с пользователем
Код:
#include <stdio.h> 
void main()
{
  char s[128];
  puts("begin test");
  do { gets(s); puts(s); } while(s[0]);
  puts("end test");
}

2. myprocess.cpp
Код:
#include "myprocess.h"

myProcess::myProcess(QWidget *parent) : QDialog(parent)
{
sb.setText("start");
ib.setText("input");
QVBoxLayout *vl=new QVBoxLayout;
vl->addWidget(&sb);
vl->addWidget(&te);
vl->addWidget(&le);
vl->addWidget(&ib);
setLayout(vl);

connect(&sb,SIGNAL(clicked()),this,SLOT(startProcess()));
connect(&ib,SIGNAL(clicked()),this,SLOT(doInput()));
connect(&myProc,SIGNAL(readyReadStandardOutput()),this,SLOT(showOutput()));
connect(&myProc,SIGNAL(readyReadStandardError()),this,SLOT(showOutput()));
}

void myProcess::startProcess()
{
QString prog="testcon.exe";
myProc.start(prog);
if(myProc.waitForStarted())
te.append(QString("Program <b>%1</b> started").arg(prog));
else
te.append(QString("Can't start program <b>%1</b>").arg(prog));
}

void myProcess::doInput()
{
QString s=le.text()+"\n";
if(myProc.write(s.toAscii())!=-1) le.clear();
}

void myProcess::showOutput()
{
te.append(QString::fromLocal8Bit(myProc.readAllStandardOutput()));
te.append(QString::fromLocal8Bit(myProc.readAllStandardError()));
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    myProcess p;
    p.show();
    return a.exec();
}

2. myprocess.h
Код:
#include <QtGui>

class myProcess : public QDialog
{
    Q_OBJECT

public:
    myProcess(QWidget *parent=0);
private slots:
void startProcess();
void showOutput();
void doInput();
private:
QProcess myProc;
QTextEdit te;
QLineEdit le;
QPushButton sb,ib;
};


собиралось в Qt 4.3
кнопка "start" запускает консольную программу, кнопка "input" помещает набранный в lineEdit текст в stdin запущенного процесса, в textEdit помещается stdout запущенной  программы.
если бы все "должно работать", то во-первых вывелась бы первая строка из testcon ("begin test"), а затем все, что вводится по "input".
но это происходит только однократно, по окончании работы testcon (надо ввести пустую строку)
Записан
Emc
Гость
« Ответ #7 : Июль 05, 2007, 17:27 »

запускал из под ide с перехватчиком stdout - в doInput добавил
cout<<"my text"<<endl;
так вот "my text" я перехватил, а текст le.text() нет. myProc.write пишет куда-то не туда (буфер?).
Записан
bond_e
Гость
« Ответ #8 : Июль 05, 2007, 17:52 »

ну а куда тогда? в доках написано:
Цитировать
You can then write to the process's standard input by calling write()

кстати, если к примеру, в testcon.cpp добавить в начало строчку
Код:
setvbuf(stdout,NULL,0,_IOFBF);
(т.е. убрать буфферизацию), то программа заработает "как надо"
может быть, можно сделать это при запуске приложения? что-нить в environment например?
Записан
Emc
Гость
« Ответ #9 : Июль 05, 2007, 19:03 »

Код:

keeping standard output and standard error data in separate internal buffers

попробуй
QProcess::setProcessChannelMode(QProcess::ForwardedChannels)
Записан
BaltikS
Гость
« Ответ #10 : Декабрь 22, 2008, 12:02 »

Поднимаю вопрос...
Есть такое консольное приложение как psql. Люди, которые работаю с PostgreSQL думаю знают её... Так вот, возник вопрос с выводом результата работы на экран. Нужно выполнить команду
Код:
psql -l -U postgres
Делаю через QProcess, как обычно всё соединяю сигналы со слотами
Код
C++ (Qt)
void readyReadStandardError () и
void readyReadStandardOutput ()
. Функция  readAllStandardOutput ()  возвращает всё как надо, если у пользователя Postgres нет пароля, а вот в случае установленного пароля возникают проблеммы! А именно, запрашивается ввод пароля. И тут программа не выдаёт абсолютно ничего! Как быть в данной систуации! Как отловить появление строки ввода пароля и добавить пароль программно?

P.S. Форум перечитал, вопрос поднимался неоднократно, но ни одно решение не помогло.
Qt 4.3.5 MSVS 2005
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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