Russian Qt Forum

Qt => Общие вопросы => Тема начата: bond_e от Июль 03, 2007, 15:17



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


Название: QProcess и консольные приложения
Отправлено: Emc от Июль 03, 2007, 17:26
хмм должно работать
на сигнал readyReadStandardOutput ()  вешаешь слот с readAllStandardOutput ()
--------
лучше выложи код - скорей всего у тебя ошибка


Название: QProcess и консольные приложения
Отправлено: Spicos от Июль 04, 2007, 05:44
http://prog.org.ru/forum/htopic_4175_qprocess.html


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


Название: QProcess и консольные приложения
Отправлено: Emc от Июль 04, 2007, 20:26
если при запуске в cmd чужой программы (отдельно от твоей) она выкидывает сообщение в консоль -- то все должно работать (наличие/отсутствие консольных окон роли не играет, если нет - то ничем не вылечишь - обращайся к автору программы. Еще раз просьба выкладывай код, заниматься гаданием не очень интересно


Название: QProcess и консольные приложения
Отправлено: Alex03 от Июль 05, 2007, 12:05
Проверьте что оно именно в stdout всё выплёвывает а не в stderr.


Название: QProcess и консольные приложения
Отправлено: bond_e от Июль 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 (надо ввести пустую строку)


Название: QProcess и консольные приложения
Отправлено: Emc от Июль 05, 2007, 17:27
запускал из под ide с перехватчиком stdout - в doInput добавил
cout<<"my text"<<endl;
так вот "my text" я перехватил, а текст le.text() нет. myProc.write пишет куда-то не туда (буфер?).


Название: QProcess и консольные приложения
Отправлено: bond_e от Июль 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 например?


Название: QProcess и консольные приложения
Отправлено: Emc от Июль 05, 2007, 19:03
Код:

keeping standard output and standard error data in separate internal buffers

попробуй
QProcess::setProcessChannelMode(QProcess::ForwardedChannels)


Название: Re: QProcess и консольные приложения
Отправлено: BaltikS от Декабрь 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