[gelöst] QProcess, execute und kill/terminate Signale

Alles rund um die Programmierung mit Qt
Antworten
hhopf
Beiträge: 6
Registriert: 8. Mai 2006 15:00

[gelöst] QProcess, execute und kill/terminate Signale

Beitrag von hhopf »

Hallo,

ich möchte eine Art Taskmanager schreiben, der mehrere zu einem Programmpaket gehörende Programme startet und überwacht. Es soll möglich sein, Programme nach Beendigung oder Absturz automatisch neu zustarten und auch Programme über den Taskmanager zu beenden (über kill oder terminate-Signal).
Leider haben alle meine bisherigen Versuche nur zum Teil zum Erfolg geführt.

1. Versuch:
Programm mit start() starten.
Funktioniert, nur wird das Programm beim Schliessen nicht sauber beendet, es bleibt ein Zombie-Prozess laufen und der Prozess hat weiterhin den Status Running.
Die Signale funktionieren aber (kill oder terminate beenden das Programm), allerdings ebenfalls mit dem Nebeneffekt, dass der Zombie-Prozess bleibt.

2. Versuch:
Programm mit execute starten.
Funktioniert auch, das Programm wird auch korrekt und komplett beendet. Allerdings reagiert der Prozess nicht auf die Signale, die scheinen erst anzukommen, wenn das Programm dann beendet wird.

3. Versuch:
Programm mit startDetached starten.
Das Programm lässt sich starten, allerdings scheint hier die Statusabfrage nicht zu funktionieren. Zumindest erhalte ich kein Running zurück.

Mein Code-Abschnitt:

Code: Alles auswählen

    do {
        process->start(command);
        process->waitForStarted();
        while ( isRunning() ) {
        }
        mutex.lock();
        if ( !restart ) {
            endloop = true;
        }
        tmpLoop = endloop;
        mutex.unlock();
    } while ( !tmpLoop );
Das ganze läuft in einem Thread.
Die do-Schleife soll bei der Einstellung "automatischer Restart" bewirken, dass das Programm nach Beendigung automatisch neu gestartet wird (funktioniert auch).
isRunning ist eine Methode, die die Stati "Starting" und "Running" von QProcess prüft.

Ich hoffe, jemand kann mir hier mit dem entscheidenden Tipp helfen.

[edit]
hab noch was vergessen: ich benutze Qt4, das ganze muss sowohl unter Linux wie auch unter Windows laufen.
[/edit]

Gruß
Hubert
hhopf
Beiträge: 6
Registriert: 8. Mai 2006 15:00

Beitrag von hhopf »

Problem gelöst:

Ein Blick in die Qt-Sourcen hat die Erleuchtung gebracht.

execute ist folgendermaßen implementiert:

Code: Alles auswählen

    QProcess process;
    process.setReadChannelMode(ForwardedChannels);
    process.start(program, arguments);
    process.waitForFinished(-1);
    return process.exitCode();
Da hier ein eigener QProcess verwendet wird, gehen meine Signale natürlich flöten.
Wenn ich start() und waitForFinished(-1) selbst aufrufe, kommen die Signale an und alles ist paletti. :wink:

Gruß
Hubert :wink:
Antworten