Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 23 von 23

Thema: Qt: QProcess Problem

  1. #16
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von chapaev
    Hmm... Das muss nciht unbedingt an transcode liegen, ich starte den Process über "sh -c script". Egal was ich starte, bekommt der gestartete Process die nächste ID.

    Ich habe gehofft, dass es niemand sagen würde.
    Ja das ist ein Script.
    Achso, ja, dann ists ja klar - der Prozess den du direkt startest und dessen pid du hast ist sh.
    Und ja, das kann definitiv schiefgehen

    Hier ist die Code:
    [CODE]void processDlg::Starting()
    {
    proc = new QProcess( this );
    proc->clearArguments();
    proc->addArgument( "sh" );
    proc->addArgument( "-c" );
    proc->addArgument( arg );
    connect( proc, SIGNAL( readyReadStdout() ),
    this, SLOT( readProcOut() ) );
    connect( proc, SIGNAL( readyReadStderr() ),
    this, SLOT( readProcError() ) );
    connect( proc, SIGNAL( processExited() ),
    this, SLOT( processExit() ) );

    Falls du den wirklich zuverlässig beenden willst msust du entweder auf sh verzichten oder dir von dem die PID von transcode auf den stdout ausgeben lassen und die dann von dort lesen, etc.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  2. #17
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Falls du den wirklich zuverlässig beenden willst msust du entweder auf sh verzichten oder dir von dem die PID von transcode auf den stdout ausgeben lassen und die dann von dort lesen, etc.
    Ich würde gerne auf sh verzichten, aber so einfach geht das nicht. Logisch könnte ich Argumente im Script zerlegen und nach einander ausführen. Aber wie mache ich das mit
    Code:
    if .....
    then
    ...... 
    else
    ......
    fi
    und da währe noch "&", "|" etc. Das wird von QProcess nicht angenommen.

    "PID von transcode auf den stdout ausgeben lassen" klingt perfeckt. Leider weiss ich nicht weie man das anstellt. Kannst du mir vielleicht ein Beispiel zeigen, bzw. ein Tipp geben?

    Danke im Voraus

    chapaev

  3. #18
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    $! ist die PID des zuletzt gestarteten Prozesses - aber da schleicht sich schon ein weiteres Problem an an das ich nicht gedacht hatte: Was garantiert dass zum Zeitpunkt des Aufrufs von "echo $!" der letzte aufgerufene Prozess der Transcode-Prozess war?
    Könnte sein dass $! der letzte in der aktuellen shell gestartete Prozess ist... aber da hab ich nichts gefunden was darauf hinweist.

    Hmm, blöde Sache das.

    [Edit]
    Transcode kann da was - aus der Manpage:
    Code:
    --write_pid file
        write pid of signal thread to file [off] Enables you to terminate transcode cleanly by sending a SIGINT (2) to the pid in file. Please note file will be overwritten. Usage example
    
    $ transcode ... --write_pid /tmp/transcode.pid &
    $ kill -2 `cat /tmp/transcode.pid`
    [/edit]



    MfG Peschmä
    Geändert von peschmae (09-04-2005 um 19:48 Uhr)
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #19
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Das nervt langsam, kaum glaubt man eine Lösung gefunden zu haben, da kommt gleich das nechste Problem.

    $ transcode ... --write_pid /tmp/transcode.pid währe auch eine Möglichkeit .... leider funktioniert das nicht (wahrscheinlich ein bug). Datei /tmp/transcode.pid wird zwar erstellt, drine findet man aber nur ein "0". Ich habe so ein Gedanke: was währe wohl wenn ich ein Process mit einem bestimmten ID laufen lasse? Shade nur das, dass (nach meine Erfahrung) nciht möglich ist. In man sh finde ich auch keine Möglichkeit PID ausgeben zu lassen. Bisher dachte ich immer "Führ alle Probleme gibt es eine Lösung", in meinem Fall stimmt es anscheint nicht.

    trotzdem danke für die hilfe

    chapaev

  5. #20
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von peschmae
    Könnte sein dass $! der letzte in der aktuellen shell gestartete Prozess ist
    Ist es, die Shell weiß nichts von anderen Shells, sie weiß aber die PIDs der von ihr gestarteten Kindprozesse.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #21
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von anda_skoa
    Ist es, die Shell weiß nichts von anderen Shells, sie weiß aber die PIDs der von ihr gestarteten Kindprozesse.
    Dann ist ja gut

    Ich meine hätte ja sein können dass die Shell den Kernel fragt nach dem zuletzt erstellten Prozess oder so...

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #22
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Wie bekomme ich jetzt PID in ein Textdatei? So klappt es schon mal nicht:
    Code:
      proc = new QProcess( this );
      proc->clearArguments();
      proc->addArgument( "sh" );
      proc->addArgument( "-c" );
      proc->addArgument( arg );
      proc->addArgument( "& echo $! > $HOME/pid" );
    Wahrscheinlich liegt es daran, dass mein script aus mehreren zeilen besteht. Das siht dann ungefehr so aus:
    Code:
    sh -c script line
            script line
            script line
            script line
            script line & echo $! > $HOME/pid"

  8. #23
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Endlich habe ich es geschafft!

    Hi Leute,

    Ich habe die Lösung für Precesse die über "sh" laufen. Deshalb habe ich mir vorgenommen eine kleine FAQ zu schreiben.

    Als erstes müssen Sie ein paar Dateien includieren:
    Code:
    #include <sys/types.h>
    #include <signal.h>
    Jetzt braucht man ein Slot, der augerufen wird, wenn das Process beendet werden soll.
    Code:
    void processDlg::startKillProc()
    {
    pidList = QStringList(); 
    // so säubern Sie QStringList
    
      int i = proc->processIdentifier(); 
    // so bekommt man PID (Process Indentifikationsnummer)
    
      QString Pid; Pid.setNum( i ); 
    // Nummer in string umwandeln
    
      killStr = QString( "ps --ppid %1 -o pid" ).arg( Pid ); 
    // killStr ist ein string
    // "ps --ppid %1 -o pid" zeigt alle Processe an, die erstellt wurden unter dem sh bzw. bash
    
      killProcess = new QProcess( this );
      killProcess->clearArguments(); 
    // argumente löschen (sinvoll wenn man kill mehrmals ausführen will)
    
      killProcess->addArgument( "sh" ); 
    // killProcess wird später alle PIDs ausgeben die wir töten wollen ;) 
    
      killProcess->addArgument( "-c" );
      killProcess->addArgument( killStr );
    
      connect( killProcess, SIGNAL( readyReadStdout() ),
               this, SLOT( readKillProcOut() ) );
      connect( killProcess, SIGNAL( processExited() ),
               this, SLOT( killStartedProcess() ) );
      killProcess->start();
    }
    So jetzt brauchen Sie die Ausgabe, die killProcess macht:
    Code:
    void MyApp::readKillProcOut()
    {
      pidList << killProcess->readStdout(); 
    // pidList ist eine QStringList. Die nimmt alle Ausgaben von killProcess auf.
    }
    Sobald killProcess beendet ist wird dieses Slot ausgeführt:
    Code:
    voidMyApp::killStartedProcess()
    {
      pidList.gres( "PID", "" ); 
    // Damit löscht man das wort "PID" aus der liste (Sie brauchen nur zahlen)
    
      for ( QStringList::Iterator it = pidList.begin(); it != pidList.end(); ++it ) 
    // nun werden alle PIDs nach einander aufgeruffen
    
      {
        QString num = *it; 
        // Ein neues string zu erstellen ist (glaube ich) nicht notwändig, 
        //aber ich habe es so gemcht.
    
        if ( !num.isEmpty() ) 
        // erste Linie in der liste ist lehr, nach dem Sie das Wort "PID" gelöscht haben, 
        // also überspringt das probramm alle lere Strings.
        {
          int ProcID = num.toInt(); 
          // QString in nummer umwandeln.
    
          kill( ProcID, 9 ); 
          // Unterprocess beendet :-D. Bleibt nur noch Hauptprocess...
        }
      }
      int i = proc->processIdentifier(); 
      // PID wieder abfragen
    
      kill( i, 9 ); 
      // und töten
      //Den hauptprocess kann man auch über proc-> kill(); töten, 
      //ist aber nciht empfohlen, da es zum Abstürz führen kann (genau so war es bei mir).
    
      delete killProcess; 
      // natürlich den Process löschen, sonst kann es zum Abstürz führen!
    }
    Hoffentlich hilft diese FAQ jemandem.

    chapaev

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •