Signal -> wann externes Programm beendet

Alles rund um die Programmierung mit Qt
Antworten
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Signal -> wann externes Programm beendet

Beitrag von kleineSchildy »

Hallo,

icb probier nun schon ne ganze Weile rum, wie ich abfangen kann, wann mein externes Programm sich beendet. Leider komme ich auf keinen grünen Zweig. Könnt ihr mir evt. helfen?

Hier ist erstmal mein Code:

Code: Alles auswählen

ScriptStarterDialog::ScriptStarterDialog( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ){
...
    connect( buttonOk, SIGNAL( clicked() ), this, SLOT( executeScript() ) );
    connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( close() ) );
}


void ScriptStarterDialog::executeScript(){

	bool exit=FALSE;
	QString text;
	
   QProcess *proc;
	proc = new QProcess(this);
	proc->addArgument("start.bat");

	if(!proc->start()){
		QMessageBox::critical( this, "ScriptStarter",
		"Script is not able to start.");
	}

	text = "Script starts...";
	ausgabe->setText(text);

}
Ich habe keinen Plan, wo ich folgendes Signal einbauen soll:

connect( proc, SIGNAL( processExited ()), this, SLOT( analyse() ) );


Vielen Dank für eure Hilfe.

Viele Grüße
Jana
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sollte da nicht QProcess::prcessExited() helfen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Hallo Christian,

wie du weiter unten in meinem Post lesen kannst, bin ich darauf auch schon gekommen
connect( proc, SIGNAL( processExited ()), this, SLOT( analyse() ) );
Mein Problem ist, dass ich nicht weiß, wie ich das Signal in meinen Code integrieren soll.

1. Innerhalb der Methode, wo mein externes Programm gestartet wird, geht nicht. Die Methode beendet sich nach dem Start des Programms und das wars.

2. Dort, wo schon die restlichen Signale stehen, geht es auch nicht, weil dort meine Variable "proc" nicht gekannt wird.

Viele Grüße
Jana
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

[quote="kleineSchildy"
1. Innerhalb der Methode, wo mein externes Programm gestartet wird, geht nicht. Die Methode beendet sich nach dem Start des Programms und das wars.[/quote]
Und was hindert dich daran dort ein connect zu machen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

Es funktioniert nicht. Ich sehe ja mit dem Taskmanager, wann sich mein externes Programm beendet. Und es wird von dem connect nicht registriert.

Woran kann das liegen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ist der Slot analyse() auch korrekt? Kompiliere mal mit 'COFNIG += console' damit du ggf. Warnungen zur Laufzeit siehst. Evtl. auch mal debuggen und bei QProcess::processExited() einen Breakpoint setzen.
Bei mir geht das ohne Probleme.
Es gibt imho auch ein Beispiel in den examples.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

das Problem ist, dass scheinbar das Signal gesendet wird, bevor das externe Programm überhaupt gestartet wurde.

Ich drücke dem Button für die Ausführung und sofort kommt die Naricht, dass das Programm beendet wurde, obwohl ich sehe (im Taskmanager), dass es gerade mal gestartet wurde :roll:
kleineSchildy
Beiträge: 76
Registriert: 16. September 2004 18:29
Wohnort: Dresden

Beitrag von kleineSchildy »

hab den "Fehler" gefunden.

ich starte mein Programm ja über eine BAT-Datei. Die hat sich, sobald sie ausgeführt war, beendet. Nun hab ich dort kleine Änderung gemacht und nun klappt alles.

Danke trotzdem für deine Hilfe.
Antworten