[gelöst] QProcess - Abfolge von "readyRead"-signal

Alles rund um die Programmierung mit Qt
Antworten
phil collins
Beiträge: 19
Registriert: 22. August 2007 17:35

[gelöst] QProcess - Abfolge von "readyRead"-signal

Beitrag von phil collins »

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):

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();
} 
Entdeckt da jemand einen logischen Fehler, oder hat sonst irgendeine Idee, wie ich die Reihenfolge richtigstellen könnte?

gruß - phil.
Zuletzt geändert von phil collins am 26. August 2007 21:40, insgesamt 1-mal geändert.
phil collins
Beiträge: 19
Registriert: 22. August 2007 17:35

Beitrag von phil collins »

Ich denke, das Problem hat sich von selbst gelöst. Ich habe einfach übersehen, dass die Ausgabe des Befehls und der neue Prompt vom selben signal stammen. :idea:
Euer Phil.
Antworten