Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 23

Thema: Qt: QProcess Problem

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

    Qt: QProcess Problem

    Hi Leute,

    Ich habe eine frage und zwar, ist es möglich mit addArgument() statt einen Befehl mehrere auf ein Mal einzufügen? Ich habe ein TextEdit in eine Stringlist geteilt und zwar nach "\n".
    Wenn ich diese Liste Linie für Linie auslese bekomme ich mehrere Strings.
    Leider funktioniert proc->addArguments(str) in diesem fall nciht? Wie soll ich jetzt vorgehen?

    Und noch eine kurze Frage kann man anzahl von Strings in einer QStringList holen? (für Progressbar )

    Dange in Voraus

    chapaev

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von chapaev
    Ich habe eine frage und zwar, ist es möglich mit addArgument() statt einen Befehl mehrere auf ein Mal einzufügen? Ich habe ein TextEdit in eine Stringlist geteilt und zwar nach "\n".
    Wenn ich diese Liste Linie für Linie auslese bekomme ich mehrere Strings.
    Leider funktioniert proc->addArguments(str) in diesem fall nciht? Wie soll ich jetzt vorgehen?
    Das geht nicht weil das Programm die Argumente genau so übergeben kriegt wie du sie hier eingibst und nicht in kleine Stückchen zerlegt. Entsprechend musst du das halt selber machen (nach ähnlichen Kriterien wie die Bash das macht - also an leerzeichen trennen)

    Und noch eine kurze Frage kann man anzahl von Strings in einer QStringList holen? (für Progressbar )
    file:///C:/qt3-win32/qt-3/doc/html/qvaluelist.html#count

    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)

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

    Bei mri klapt gar nichts :(

    Das geht nicht weil das Programm die Argumente genau so übergeben kriegt wie du sie hier eingibst und nicht in kleine Stückchen zerlegt. Entsprechend musst du das halt selber machen (nach ähnlichen Kriterien wie die Bash das macht - also an leerzeichen trennen)
    Nach leehrzeichen spliten habe ich auch versucht

    Code:
      
    procList = QStringList::split("\n", proesseStr);
    for ( QStringList::Iterator it = procList.begin(); it != procList.end(); ++it )
      {
        proc->clearArguments();
        QStringList arguments = QStringList::split(" ", *it);
        proc->setArguments(arguments);
        connect( proc, SIGNAL(readyReadStdout()),
                 this, SLOT(readProcOut()) );
        connect( proc, SIGNAL(readyReadStderr()),
                 this, SLOT(readProcError()) );
    
        if ( !proc->start() )
        {
          QMessageBox::critical( 0,
                                 tr("Fatal error"),
                                 tr("Could not start the uic command."),
                                 tr("Quit") );
        }
    wenn ich als Befehl das eingebe: echo 1 && sleep 5 && echo 2
    siht die Ausgabe so aus "1 && sleep 5 && echo 2"
    komisherweise werden die Zeichen "" uach angezeigt : echo "1" && sleep 5 && echo "2" = "1" && sleep 5 && echo "2"
    Hat vielleicht jemand ein Vorshlag wie ich es machen kann?

    file:///C:/qt3-win32/qt-3/doc/html/qvaluelist.html#count
    Ich benutze linux, ;-) ist aber nicht so wichtig. Wenn ich mir diese Documentation so ansehe, kopiere ich leider gar nichts. Gibt es irgend wo ein Beispiel? Bzw. kannst du mir ein kleines beispiel posten?

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von chapaev
    wenn ich als Befehl das eingebe: echo 1 && sleep 5 && echo 2
    siht die Ausgabe so aus "1 && sleep 5 && echo 2"
    komisherweise werden die Zeichen "" uach angezeigt : echo "1" && sleep 5 && echo "2" = "1" && sleep 5 && echo "2"
    Hat vielleicht jemand ein Vorshlag wie ich es machen kann?
    Jetzt unabhängig vom Code den du oben gepostet hast hast du hier ein Problem denn diese Befehlsfolge bedingt:
    1) Ausführen von "echo 1"
    2) Überprüfen des Rückgabewertes von Echo (völlig Sinnfrei ) wenn 0 dann gehts weiter mit 3
    3) Ausführen von "sleep 5"
    4) Überprüfen des Rückgabewertes von "sleep 5", wenn 0 dann gehts weiter mit 5
    5) ausführen von echo 2
    6) Überprüfen des Rückgabewertes und damit nichts machen

    So Zeugs kann die Bash am besten imo - wenn du native Programme mit QProcess ausführst bedingt das ja sowieso schon fast ein Linux/Unix-System oder was ähnliches. Also einfach folgende drei Argumente übergeben:
    bash
    -c
    echo 1 && sleep 5 && echo 2
    jeweils als separate Strings für addArgument. Ist wohl am einfachsten so als das alles von Hand auseinanderzunehmen und korrekt auszuführen.

    Ich benutze linux, ;-) ist aber nicht so wichtig. Wenn ich mir diese Documentation so ansehe, kopiere ich leider gar nichts. Gibt es irgend wo ein Beispiel? Bzw. kannst du mir ein kleines beispiel posten?
    Ups, sorry, das war im Browser und ich hatte vergessen dass ich die Dokumentation lokal gespeichert und verlinkt habe weils so schneller ist als online und auch geht wenn ich gerade keine Internetverbindung laufen habe

    Naja, auf jeden Fall hat das Ding eine Methode count() die dir einen int-Wert mit der Zahl drin liefert. (Zu finden in der Doku von QValueList von der QStringList ja abgeleitet ist)

    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)

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Danke für das Antwort!
    du hast mir das Leben geretet

    Man bin ich blöd! Ich dachte die ganze Zeit das QProcess Arguments über bash ausführt ! Ich habe nicht daran gedacht das QProcess auch unter windows und mac funtkioniert und da gibt es so viel ich weis keinen bash.

    Noch eine kurze Frage:
    Wo kann man hilfe zu "int" finden? In Qt documetation finde nichts , bzw. suche ich falsh.

    MfG

    chapaev

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von chapaev
    Noch eine kurze Frage:
    Wo kann man hilfe zu "int" finden? In Qt documetation finde nichts , bzw. suche ich falsh.
    Äh, ich verstehe die Frage nicht ganz. Was ist das Problem mit int? int sind so Ganzzahlen - einer der Datentypen von C/C++, in Qt ist da nichts speziell oder anders als sonst überall auch also wird da auch nichts speziell dokumentiert.

    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. #7
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109

    Ich denke die Frage passt zum Thema

    Ich habe das so gemacht wie du es gesagt hast peschmae.
    Code:
    bash
    -c
    echo 1 && sleep 5 && echo 2
    Leider funktioniert kill nicht mehr.
    Code:
    proc->kill();
    macht zwar mit dem script nicht weiter, aber der befehl der grad läuft, wird nicht beendet. Ich verstehe nicht woran das liegt ... Kann mir jemand ein Rat geben?

    MfG

    chapev

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

    Noch eine Frage zum Thema QProcess

    Ich wollte nur fragen ob es möglich ist ein kill signal in ein process zu senden wehred er läuft? Damit meine ich STRG+C. Falls ja dann wie?

    Danke im Voraus

    chapaev

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ja
    man 2 kill

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Ja
    man 2 kill
    Ich kopiere da gar ncihts. So viel ich weis kann man mit kill nur ein Process killen, wenn ID bekant ist. Wenn man transcode ausführt werden gleich mehrere solche IDs erzeugt:
    ps -A | grep transcode
    22081 ? 00:00:04 transcode
    22082 ? 00:00:00 transcode
    22083 ? 00:00:00 transcode
    22085 ? 00:00:09 transcode
    22086 ? 00:00:00 transcode
    22090 ? 00:00:00 transcode
    22091 ? 00:00:01 transcode
    Ich wollte nur ein signal senden (writeToStdin()), der drucht halten von STRG und C erzeugt wird. Also änlich wie kde konsole das macht.

    MfG

    chapaev

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von chapaev
    Ich kopiere da gar ncihts. So viel ich weis kann man mit kill nur ein Process killen, wenn ID bekant ist.
    QProcess:rocessIdentifier()

    Wenn man transcode ausführt werden gleich mehrere solche IDs erzeugt:
    Das sind nur die Threads des Prozesses bzw Kindprozesse.

    Ich wollte nur ein signal senden (writeToStdin()), der drucht halten von STRG und C erzeugt wird. Also änlich wie kde konsole das macht.
    STRG+C wird nicht an den Input des Programms geschickt, sondern es wird eben ein Signal (man 7 signal) an den Prozess gesandt (SIGINT)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

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

    Vielen dank hat geklappt!

    Entschuldegung, dass es so lange gedauert hat bis ich antworten kann, hatte in letzte Zeit viel zu tun.
    So hat's geklappt:
    Code:
    int i = proc->processIdentifier();
    int currentID = kill( i + 1, 9 );
    ...
    Da währe noch eine Frage warum unterscheiden sich PID in Qt von Konsole? Wie ich festgestellt habe, bekommt trancode process immer das nechste ID nach dem "proc". Kann das nicht zu Misvertändlissen führen? Ich meine, dass statt transcode ein anderes Process gekillt wird? (hoffentlich nicht )

    Noch mals danke für die Hilfe

    chapaev

  13. #13
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich vermute mal - so ganz sicher weiss ich das nicht - adass der Transcode-Prozess einen (oder mehrere) andere startet und sich dann beendet - der andere Prozess hat dann die nächste Prozess-ID, logisch.

    Und ja, das kann schief gehen, wenn in zwischenzeit ein anderer Prozess erstellt wird...

    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)

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Oder vielleicht ein Skript?

    Welchen Befehl startest du den genau?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    05.06.2004
    Ort
    mainaschaff
    Beiträge
    109
    Zitat von peschmae:
    Ich vermute mal - so ganz sicher weiss ich das nicht - adass der Transcode-Prozess einen (oder mehrere) andere startet und sich dann beendet - der andere Prozess hat dann die nächste Prozess-ID, logisch.
    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.

    Zitat von peschmae:
    Und ja, das kann schief gehen, wenn in zwischenzeit ein anderer Prozess erstellt wird...
    Ich habe gehofft, dass es niemand sagen würde.
    Zitat von anda_skoa:
    Oder vielleicht ein Skript?
    Ja das ist ein Script.

    Zitat von anda_skoa:
    Welchen Befehl startest du den genau?
    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() ) );
    
      if ( !proc->start() )
      {
        QMessageBox::critical( 0,
                               tr( "Fatal error:" ),
                               tr( "Kann den befehl \"sh\" nicht starten" ) );
      }
    }
    MfG

    chapaev

Lesezeichen

Berechtigungen

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