Seite 1 von 1

[gelöst] qprocess

Verfasst: 20. November 2007 00:30
von rup
hallo,

ich bin neu in qt und hab ein kleines prog mit oberfläche designed
und kann sie auch starten - ich will über einen button
einen anderen prozess starten

der button ist mit der Funktion hallo verbunden

hier mein code

Code: Alles auswählen


void Viewer::hallo()
{
int pid;

QProcess pro;
pid = (int) pro.pid();
printf("pid: %i \n", pid);
pro.start("more");

}
die Ausgabe ist :
pid: 0
QProcess: Destroyed while process is still running.

pstree sagt das der 2. Prozess erzeugt wird
aber das programm wird sofort beendet

hab keine Ahnung warum ?? hab auch in google und in der qt hilfe
nur samples gefunden die so funktionieren sollten

hmm pls help :)
rup

Verfasst: 20. November 2007 06:33
von Christian81
Das ist ein C++ - Problem. Wo denkst Du wird dein QProcess zerstört?

Verfasst: 20. November 2007 07:59
von Korgen
mit pro.start wird pro in einem neuen Prozess gestartet und dein Programm macht mit der Ausführung weiter. Deine Methode ist zu Ende, pro geht out of scope und schwups hast du die Ursache für dein Problem.

Lösungen:

1.pro.waitForFinished(-1) (dann friert allerdings deine GUI ein, bis der Prozess beendet wird)
2.pro als Member deklarieren.

Grüße

Verfasst: 20. November 2007 10:26
von rup
hmm - danke

zu 1. wenn die gui einfriert ist das keine brauchbare lösung -

zu 2. pro ist ein Objekt vom Typ Qprocess ?
mir ist nicht ganz klar wie ich pro als member defieren soll ?

Verfasst: 20. November 2007 10:34
von solarix
damit meint Korgen eine private Variabel deiner Klasse "Viewer"..

Code: Alles auswählen

class Viewer .....
{
 ....
 private
    QProcess pro;
 ...
Das Signal "void QProcess::stateChanged ( QProcess::ProcessState newState )"
kannst du ja fuer die Anzeige des Prozess-Zustandes verwenden, dann hast du auch keine Probleme mit dem Einfrieren und brauchst auch nicht zu pollen..

Verfasst: 20. November 2007 10:36
von zwutz
rup hat geschrieben:zu 2. pro ist ein Objekt vom Typ Qprocess ?
mir ist nicht ganz klar wie ich pro als member defieren soll ?
sobald du pro innerhalb einer Funktion deklarierst wird es automatisch am Ende der Funktion über den Jordan geschickt.

Eine Lösung wäre, pro innerhalb der Klasse Viewer als Member zu deklarieren.

z.B.

Code: Alles auswählen

class QProcess;

class Viewer
{
   ...
private:
   QProcess *_pro;
};
dann hast du die Membervariable _pro und kannst dann über

Code: Alles auswählen

_pro = new QProcess;
in deiner hallo-Funktion weiter damit arbeiten...

die Codeschnipsel sollten eigentlich funktionieren... aber zumindest grob sollte es passen :P

-edit- zu langsam :(

Verfasst: 20. November 2007 12:01
von rup
ok fehlermeldung ist weg --
aber programm läuft immer noch nicht
mein code:

Code: Alles auswählen

void Viewer::hallo()
{
 int pid,state;
 pro.start("more");
 pid = (int) pro.pid();
 printf("pid: %i \n", pid); 
 state = (int) pro.state();
 printf("state: %i \n", state);
}
die ausgabe jetzt:
pid: 4911
state: 1

ist schon mal nicht schlecht -- aber "1" ist ja state starting - wie bekomme ich
das programm in state "2" ?

wenn das gesartete programm ein printf() enthält schreibt dieses auf die konsole oder
wird das irgendwie intern von meinem vater qt prozess abgefangen ?

danke & lg rup

Verfasst: 20. November 2007 12:57
von solarix
rup hat geschrieben:ok fehlermeldung ist weg --
aber programm läuft immer noch nicht
Doch.. das laeuft schon.. du weisst es nur noch nicht.. :wink:
rup hat geschrieben: wie bekomme ich
das programm in state "2" ?
Das macht das Qt von alleine.. die Prozesserzeugung dauert halt ein paar ms... Wir haben doch schon geschrieben, dass du entweder waitFor.... () oder das Signal "stateChanged()" anschauen und einbauen sollst...
rup hat geschrieben: wenn das gesartete programm ein printf() enthält schreibt dieses auf die konsole oder
wird das irgendwie intern von meinem vater qt prozess abgefangen ?
siehe doku (z.B. "readAllStandardOutput ()")

Verfasst: 20. November 2007 16:00
von rup
schreibe gerade diplomarbeit und muss mich
in mehreren für mich neuen themen einlesen
zb opengl, qt usw. und die zeit läuft und die dokus sind riesig

dh tipps wo man nachlesen muss sind sehr hilfreich

danke !! :)

Verfasst: 20. November 2007 21:36
von rup
es geht !!

cout << "wait:" << pro.waitForStarted(3000) << "\n";
cout << "state:" << pro.state() << "\n";
cout << "finished: "<< pro.waitForFinished(4000) << "\n";
cout << pro.readAllStandardOutput().data() << flush;

lg rup