[gelöst] qprocess

Alles rund um die Programmierung mit Qt
Antworten
rup
Beiträge: 5
Registriert: 20. November 2007 00:20

[gelöst] qprocess

Beitrag 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
Zuletzt geändert von rup am 20. November 2007 21:36, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das ist ein C++ - Problem. Wo denkst Du wird dein QProcess zerstört?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Korgen
Beiträge: 42
Registriert: 28. März 2006 16:37

Beitrag 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
rup
Beiträge: 5
Registriert: 20. November 2007 00:20

Beitrag 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 ?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
zwutz
Beiträge: 14
Registriert: 20. November 2007 09:13

Beitrag 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 :(
rup
Beiträge: 5
Registriert: 20. November 2007 00:20

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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 ()")
rup
Beiträge: 5
Registriert: 20. November 2007 00:20

Beitrag 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 !! :)
rup
Beiträge: 5
Registriert: 20. November 2007 00:20

Beitrag 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
Antworten