[gelöst] QProcess - Signal finished wird nicht ausgelöst

Alles rund um die Programmierung mit Qt
Antworten
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

[gelöst] QProcess - Signal finished wird nicht ausgelöst

Beitrag von Urki »

Hallo,

irgendwie stehe ich etwas auf dem Schlauch.
Szenario: Ich rufe ein externes Programm auf und will es, wenn es beendet wird, direkt neustarten. Mein kleiner test dazu:

process.h

Code: Alles auswählen

#ifndef PROCESS_H
#define PROCESS_H

#include <QObject>
#include <QProcess>

class Process : public QObject
{
Q_OBJECT
public:
    explicit Process(QObject *parent = 0);

    QProcess *myProcess;

signals:

public slots:
    void restartslot();

private:
    void init();
};

#endif // PROCESS_H
process.cpp

Code: Alles auswählen

#include "process.h"
#include <stdio.h>

Process::Process(QObject *parent) :
    QObject(parent)
{
    myProcess = new QProcess(this);

    if ( connect(myProcess,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(restartslot()))) {
        printf("Connect erfolgreich\n");
    }

    init();

}

void Process::init() {

    myProcess->start("calc.exe", QStringList());

    //Funktioniert nur mit waitForFinished(), sonst wird das Signal nicht ausgelöst.
    //myProcess->waitForFinished();
}

void Process::restartslot()
{
    init();
}
Aufruf durch:

Code: Alles auswählen

Process *test = new Process(0);
Wenn ich myProcess->waitForFinished(); mache, dann wird beim Beenden des Programmes das Signal finished ausgelöst und ich kann es neustarten. Dadurch blockiere ich ja aber den restlichen Programmablauf, bzw später das GUI, und ich bräuchte dann auch kein Signal/slot, da ich ja dann genau weiß, wann das Programm beendet wurde. Kommentiere ich die Zeile aus, wird das Signal finished aber nie ausgelöst.Da ich das mit mehreren Prozessen gleichzeitig machen will, nützt mir das nichts, es sei denn ich benutze Threads ...

Ich hab nun schon einige Beiträge dazu gelesen und sehe da keinen Unterschied. Zur not steige ich auf die Winapi um, aber ich wollte eigentlich ganz gerne Plattformunabhängig bleiben.

2. Noch eine kleine Verständnisfrage ;):
Kann ich über die Signale

Code: Alles auswählen

void	error ( QProcess::ProcessError error )
void	readyReadStandardError ()
void	readyReadStandardOutput ()
erkennen ob ein Programm hängt? In Windows: keine Rückgabe.

Danke im Voraus und schönen 4. Advent :D.
Zuletzt geändert von Urki am 21. Dezember 2009 17:00, insgesamt 1-mal geändert.
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

Beitrag von Urki »

Hmpf ... ganz toll. Von der Theorie her funktioniert der Code aus dem ersten Post.

Ich hatte

Code: Alles auswählen

Process *test = new Process(0);
direkt aus der main Funktion heraus aufgerufen. Bis das Programm startet, funktioniert auch noch alles. Da bekomme ich noch ein stateChanged bis Running und auch ein started Signal zurück. Alles danach, wenn das Programm erstmal läuft, geht ins Nirvana. Die Signale kommen nicht mehr an.

Ich habe jetzt vorher ein MainWindow erstellt mit einem Button über den ich das Objekt erstelle

Code: Alles auswählen

Process *test = new Process(0);
und siehe da ... das finished Signal kommt an.

Interessieren würde mich noch, was er initialisiert, damit es dann funktioniert. Hat jemand eine Idee? Ich müsste es nochmal genauer Nachlesen, aber es steht doch nirgends, dass es nicht direkt über die Konsole funktioniert, damit wäre das doch theoretisch ein Bug?
Antworten