Seite 1 von 1

QProcess

Verfasst: 26. Dezember 2007 14:13
von piXelshooter
hi.
folgender Code:

Code: Alles auswählen

#include <QProcess>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[]){
	QProcess	program;
	QString		programName = "cmd";
	string		input;
	program.start(programName);
	while(program.state() == QProcess::Running){
		cout << '\n';
		getline(cin, input);
		program.write(input.c_str(), strlen(input.c_str()));
		QByteArray output = program.readAllStandardOutput();
		cout << output.length() << ' ' << output.constData();
	}
	cout << "End";
}
das doofe is jetzt: warum krieg ich keine ausgabe? wenigstens der standard prompt müsste doch zu sehen sein:

Code: Alles auswählen

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\>
aber nichts dergleichen. wenn ich QProcess den stdout in eine Datei schreiben lasse, sehe ich immerhin das da in der datei, aber wenn ich in den prozess schreibe: "echo hallo", kommt "hallo" wieder nicht in der datei an.

Wat mach ich falsch?

Re: QProcess

Verfasst: 26. Dezember 2007 14:35
von gboelter
piXelshooter hat geschrieben: das doofe is jetzt: warum krieg ich keine ausgabe? wenigstens der standard prompt müsste doch zu sehen sein:
Also eine Ausgabe kriege ich bei Deinem Code schon, naemlich

Code: Alles auswählen

QProcess: Destroyed while process is still running.
Alerdings wuerdest Du auch unter C++ keine Ausgabe erhalten, Dir fehlt das "end" in den entsprechenden Zeilen, also z. B. so ...

Code: Alles auswählen

cout << "End" << endl;

Verfasst: 26. Dezember 2007 17:15
von piXelshooter
dammische gepufferte streams -.- hatte damit nie probleme...
ehm naja, ma schnell entsprechend geändert ne, ändert aber nix an der sache, und auch an besagte fehlermeldung komm ich net ran :-\

Verfasst: 26. Dezember 2007 18:07
von gboelter
Versuch mal, ob es so tut, was Du willst ...

Code: Alles auswählen

#include <QProcess>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    QProcess program;
    QString  programName = "cmd";
    //QString  programName = "gnome-terminal";
    string  input;

    program.start(programName);

    while (program.state() == QProcess::Running)
    {
        cout << '\n' << endl;
        getline(cin, input);
        program.write(input.c_str(), strlen(input.c_str()));
        QByteArray output = program.readAllStandardOutput();
        cout << output.length() << ' ' << output.constData();
    }

    program.waitForFinished();

    cout << "End" << endl;
}
Ich weiss, ist quick & dirty aber unter Linux funktioniert's schon mal. Allerdings ist mir nicht ganz klar, was Du eigentlich damit ereichen willst. Oben ruftst Du den cmd auf, der solte auch gestartret werden und das Programm wartet, bis Du den cmd wieder beendest. Deine Schleife unten macht allerdings fuer mich keinen Sinn. Andrerseits vermute ich, dass es Dir mehr um QProcess, als um die Schleife geht.

Aber wie gesagt, versuch's mal so ....

Verfasst: 26. Dezember 2007 19:06
von piXelshooter
Vorweg: Dein Code funktioniert hier nicht, stdout gibt immer 0 byte zurück.

Ziel ist: Cmd wird gestartet. Solange Cmd läuft, wird stdin eingelesen und an Cmd gereicht und stdout von Cmd gelesen und angezeigt. später soll die anzeige nicht mehr über stdout laufen, dass ich atm cout/cin benutze liegt einfach daran, dass erst ma QProcess arbeiten soll. Darum auch die schleife, dass eben solange cmd sich durch exit nicht beendet hat noch eingaben gelesen werden.