[gelöst] QProcess - Abfolge von "readyRead"-signal
Verfasst: 26. August 2007 12:36
Hallo zusammen.
Ich habe folgendes Problem:
Mit Qt will ich mir ein kleines Konsolen-Plugin schreiben, das (momentan erst mal) unter Windows XP laufen soll. In meinem Programm starte ich einen QProcess mit start("cmd.exe"), also die DOS-Shell, und fange die signals "readyReadStandardOutput()" und "readyReadStandardError()" mit entsprechenden slots ab.
Nu aber zum Problem: gibt man der Konsole einen Befehl, der einen error-output erzeugt, so ist "readyReadStandardError()" anscheind immer das letzte signal, das gesendet wird - so erscheint im output meines Programms
- zuerst der Befehl
- dann der prompt für den nächsten Befehl
- jetzt erst die Fehlermeldung
Der Code dazu sieht in etwa so aus (den GUI-Anteil habe ich der Kürze halber weggelassen):
Entdeckt da jemand einen logischen Fehler, oder hat sonst irgendeine Idee, wie ich die Reihenfolge richtigstellen könnte?
gruß - phil.
Ich habe folgendes Problem:
Mit Qt will ich mir ein kleines Konsolen-Plugin schreiben, das (momentan erst mal) unter Windows XP laufen soll. In meinem Programm starte ich einen QProcess mit start("cmd.exe"), also die DOS-Shell, und fange die signals "readyReadStandardOutput()" und "readyReadStandardError()" mit entsprechenden slots ab.
Nu aber zum Problem: gibt man der Konsole einen Befehl, der einen error-output erzeugt, so ist "readyReadStandardError()" anscheind immer das letzte signal, das gesendet wird - so erscheint im output meines Programms
- zuerst der Befehl
- dann der prompt für den nächsten Befehl
- jetzt erst die Fehlermeldung
Der Code dazu sieht in etwa so aus (den GUI-Anteil habe ich der Kürze halber weggelassen):
Code: Alles auswählen
#ifndef OBJECT_H_
#define OBJECT_H_
#include <QObject>
#include <QProcess>
class Object : public QObject
{
Q_OBJECT
public:
Object(QObject* parent = 0);
virtual ~Object() {}
void input(const char* com);
private:
QProcess process;
public slots:
void readStandard();
void readError();
};
#endif /*OBJECT_H_*/Code: Alles auswählen
#include <iostream>
#include "Object.h"
using namespace std;
Object::Object(QObject* parent) :
QObject(parent)
{
connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(readStandard()));
connect(&process, SIGNAL(readyReadStandardError()), this, SLOT(readError()));
process.start("cmd.exe", QIODevice::Unbuffered | QIODevice::ReadWrite);
}
void Object::readStandard() {
cout << process.readAllStandardOutput().data() << flush;
}
void Object::readError() {
cerr << process.readAllStandardError().data() << flush;
}
void Object::input(const char* command) {
process.write(command);
}
Code: Alles auswählen
#include <QApplication>
#include <QPushButton>
#include "Object.h"
using namespace std;
int main(int argc, char** argv) {
QApplication app(argc, argv);
Object ob;
ob.input("nichtExistierenderBefehl\n");
QPushButton but("Exit");
but.connect(&but, SIGNAL(clicked()), &app, SLOT(quit()));
but.show();
return app.exec();
}
gruß - phil.