2011-01-17 8 views
0

Ich habe einen Steckplatz, der einige Argumente in einem QProcess übergeben wird. Ich führe ein externes Programm mit einigen dieser Argumente aus. Das Problem ist, dass ich eine Warteschlange für diese Prozesse haben möchte, bis der vorherige Prozess beendet ist, um den nächsten zu starten.Wie kann ich eine Warteschlange mit QProcess verwenden?

Was ist Ihrer Meinung nach der beste/einfachste Weg?

Hier ist meine Methode/Schlitz:

void FirstCase::CallApp(QString text, QString pathAndFileName) 
{ 
    QString command = QString("App1.exe %1 -Z %2").arg(pathAndFileName).arg(message); 
    QProcess* process = new QProcess(this); 
    process->start(command); 
} 

EDIT Hier ist die Lösung, wenn Sie es brauchen:

Nach der QStringList Idee, mein CallApp Methode fügt nur den Befehl an den QStringList wie:

list << command; 

Und dann Aufrufe an Execute();

void FirstCase::Execute() 
{ 
    if(!list_.isEmpty()&&!executing_) 
    { 
     QProcess* p = new QProcess(this); 
     QString c = list_.takeFirst(); 
     p->start(c); 
     executing_=TRUE; 
     connect(p, SIGNAL(finished(int)),this,SLOT(ExecFinished())); 
    } 
} 

void FirstCase::ExecFinished() 
{ 
    executing__=FALSE; 
    Execute(); 
} 
+0

Ich empfehle dringend, die QStringList-Überladung von start() mit getrennten Argumenten zu verwenden. Sonst werden Sie ziemlich bald auf Probleme stoßen (z. B. wenn das Programm, das Sie ausführen, ein Leerzeichen in seinem Pfad hat). Die QStringList() - Version führt das Anbieten automatisch aus. –

+0

Sie verwenden das fertige Signal falsch, siehe meine Antwort unten. – ismail

Antwort

4

Sie können eine QString-Warteschlange verwenden, um Ihre Befehle in eine Warteschlange zu stellen und sie zu speichern. Beginnen Sie dann am Anfang der Warteschlange, starten Sie einen neuen Prozess und verbinden Sie das fertige() Signal mit einem Steckplatz. Wenn dieser Prozess abgeschlossen ist, starten Sie einen neuen Prozess, wenn die Warteschlange nicht leer ist und so weiter.

0

Die korrekte Signatur für finished Funktion ist;

void QProcess::finished (int exitCode, QProcess::ExitStatus exitStatus) 

so sollten Sie wie folgt verbinden;

connect(p, SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(ExecFinished())); 
Verwandte Themen