/* stdInReader.h under [GNU GPL v.2] from Denjs Простой класс-обертка для работы с потоками STDIN|STDOUT|STDERR. ver.2009.09.14 (естественно альфа, но работает и это главное) UTF-8 russian encoded file */#include <QtCore> #include <QThread> #include <QFile> class stdInReader : public QThread { Q_OBJECT public: stdInReader(QObject * parent = 0);// void run(); int init();//opend threads and became ready to work. /* return 1 if some errors was happened 0 of all ok -1 if can`t oopen stdIn -2 if can`t oopen stdOut -3 if can`t oopen stdErr */ void run(); signals: void received_StdIn(const QByteArray &data); public slots: int send_StdOut(const QByteArray &_data); int send_StdErr(const QByteArray &_data); private: QFile stdIn; QFile stdOut; QFile stdErr; QByteArray data; bool inited; };
/* stdInReader.cpp : UTF-8 russian encoded file*/#include <stdInReader.h>stdInReader::stdInReader(QObject * parent) : QThread (parent) { inited=false; }int stdInReader::init() { inited=false; if (! stdIn.open(stdin, QIODevice::ReadOnly)) return -1; if (! stdOut.open(stdout, QIODevice::WriteOnly)) return -2; if (! stdErr.open(stdout, QIODevice::WriteOnly)) return -3; inited=true; return 0; };//-----------------------------------------------------void stdInReader::run() { if (!inited) return; while (true) { /*/ while (stdIn.bytesAvailable()==0) //<------- ВНИМАНИЕ! так - НЕ работает... да) QT 4.5 //почему-то пока не начнешь читать, размер буфера не обновится... this->msleep(1000); /* - */ data=stdIn.read(1); //тут "блокирующее чтение"... потому никаких sleep не надо if (stdIn.bytesAvailable()>0) data.append(stdIn.read(stdIn.bytesAvailable()));//и только тут буфер покажет сколько нам послупило данных. лол) emit received_StdIn(data); /*-/ ////------ далее - демо код для примера ---------- //// что бы оно заработало - надо stdOut.open... раскомментировать выше... stdOut.write(QByteArray().append(QString("["))); stdOut.write(data); stdOut.write(QByteArray().append(QString("]"))); stdOut.flush();//отправим сразу... /* - */ }; return; }//-----------------------------------------------------int stdInReader::send_StdOut(const QByteArray &_data) { int rz=stdOut.write(_data); stdOut.flush(); return rz; }//-----------------------------------------------------int stdInReader::send_StdErr(const QByteArray &_data) { int rz=stdErr.write(_data); stdErr.flush(); return rz; }
#!/bin/bash./testcon.bin <<ENDSShello!how are you!ENDSS
QFile stdIn;stdIn.open(stdin, QIODevice::ReadOnly)
C++ (Qt) QFile stdIn; stdIn.open(stdin, QIODevice::ReadOnly); QByteArray data; data = stdIn.readAll(); qApp->processEvents(); ui->lineEdit->setText(data);
data=stdIn.read(1); //тут "блокирующее чтение"... потому никаких sleep не надо if (stdIn.bytesAvailable()>0) data.append(stdIn.read(stdIn.bytesAvailable()));//и только тут буфер покажет сколько нам послупило данных. лол)
C++ (Qt)forever { data=stdIn.read(1); if (stdIn.bytesAvailable()>0) data.append(stdIn.read(stdIn.bytesAvailable())); emit received_StdIn(data); }
class Receiver : public QObject{ Q_OBJECTslots:void readyRead(){QTextStream input(stdin);QString msg = input.read(256);// TODO}}Receiver recevier;QSocketNotifier *noti = new QSocketNotifier(STDIN_FILENO, QSocketNotifier::Read, qApp); noti->connect(noti, SIGNAL(activated(int)), &recevier, SLOT(readyRead()));