Einige Fragen zu QProcess in QT4



  • Hallo,

    Ich möchte ein externes Konsolenprogramm mit QProcess starten, aber irgendwie bekomme ich es nicht hin.

    - Die Konsole soll nicht sichtbar (also versteckt) sein
    - Meine Anwendung soll warten, bis der neue Process fertig ist und erst dann
    weiter machen. Also kein eigener Thread für den Process!
    - Die Konsolenanwendung muss aus einer Datei statt vom stdin lesen
    - Die Konsolenanwendung muss in eine Datei statt in den stdout schreiben

    Der eigentliche Aufruf (klappt mit system) lautet:

    test.exe < testinput.txt > testoutput.txt 2> testlogfile.txt
    

    Ich habe schon in der Dokumentation von Trolltech nach geschaut, aber irdgenwie bin ich zu blind.

    Vieleicht weiß ja eienr von Euch Rat...

    Vielen Dank im Voraus,

    gruß Paddy



  • Paddy82 schrieb:

    Hallo,

    Ich möchte ein externes Konsolenprogramm mit QProcess starten, aber irgendwie bekomme ich es nicht hin.

    - Die Konsole soll nicht sichtbar (also versteckt) sein
    - Meine Anwendung soll warten, bis der neue Process fertig ist und erst dann
    weiter machen. Also kein eigener Thread für den Process!
    - Die Konsolenanwendung muss aus einer Datei statt vom stdin lesen
    - Die Konsolenanwendung muss in eine Datei statt in den stdout schreiben

    Der eigentliche Aufruf (klappt mit system) lautet:

    test.exe < testinput.txt > testoutput.txt 2> testlogfile.txt
    

    Ich habe schon in der Dokumentation von Trolltech nach geschaut, aber irdgenwie bin ich zu blind.

    Vieleicht weiß ja eienr von Euch Rat...

    Vielen Dank im Voraus,

    gruß Paddy

    In der Doku zu QProcess steht, wie man auf den Prozess wartet. Es sind die waitFor* Funktionen



  • Weißt Du zufällig auch wie man die Konsole verstecken kann?
    Das habe ich leider nicht gefunden.

    Des Weiteren klappt der Aufruf mit dem Shiften nicht:

    QString befehl;
             befehl = "test.exe < testinput.txt > testoutput.txt 2> testlogfile.txt";
             QProcess myProcess;
             myProcess.start(befehl);
    

    Es geht zwar eine Konsole auf und wieder zu, aber irgendwie wird die test.exe nicht korrekt ausgeführt.
    Wenn ich nun den gleichen String in einem Systembefehl aufrufe, klappt alles.

    Eventuell muss man die "Environment" umsetzen, allerdings ist die Beschreibung von setEnvironment echt nicht gut dokumentiert. Ich weiß gar nicht, wie ich den String aufbauen soll, was da alles drin stehen muss usw.



  • Warum nimmst du dann den system Befehl nicht mehr? QProcess ist eher für Befehle gedacht, bei denen man Ein- und Ausgabe selbst steuert. Ebenso ist dies für nichtblockierende Kommunikation ausgelegt.

    Wenn du es unbedingt mit QProcess machen willst, dann musst du, so wie ich das sehe, die Ein- und Ausgabe selbst umleiten, wie es die Shell machen würde.



  • ich muss es nicht mit QProcess machen, allerdings darf die Konsole nicht sichtbar sein und genau dass ist der springende Punkt, warum ich es nicht mit system machen kann, denn mit system ist die Konsole immer sichtbar.

    Kennst Du sonst noch andere Alternativen?



  • Paddy82 schrieb:

    ich muss es nicht mit QProcess machen, allerdings darf die Konsole nicht sichtbar sein und genau dass ist der springende Punkt, warum ich es nicht mit system machen kann, denn mit system ist die Konsole immer sichtbar.

    Kennst Du sonst noch andere Alternativen?

    Das mit der sichtbaren Konsole ist ein Windows Problem. Da hab ich keine Ahnung von.

    Es sollte aber auch kein Problem sein, das mit QProcess zu erledigen. Du öffnest einfach beide Dateien, liest die Daten des Programms und schreibst diese in die Dateien. Nichts anderes macht die Shell auch.



  • und wie verstecke ich dann die konsole?

    das mit dem Lesen und schreiben klappt irgendwie auch nicht:

    QFile Input, Output, Error;
        QByteArray in, out, err;
    
        Input.setFileName("C:\\test.txt");
        Input.open(QIODevice::ReadOnly);
        in = Input.readAll();
        Input.close();
    
        Output.setFileName("C:\\testneu.txt");
        Output.open(QIODevice::WriteOnly);
    
        QProcess myProcess;
        myProcess.write(in);
        myProcess.start("C:\\test.exe");
        out = myProcess.readAllStandardOutput();
    
        Output.write(out);   
    
        Output.close();
    

    der systemaufruf war

    test.exe < test.txt > testneu.txt
    

Anmelden zum Antworten