Wie zu verwenden einen Prozess (QProcess) in einen neuen thread (QThread)?

Ich habe den folgenden code:

 void Processmethod()
{

    QDialog *ProcessMessage = new QDialog;      
    Ui::DialogProcessMessage Dialog;            
    Dialog.setupUi(ProcessMessage);             
    ProcessMessage->setModal(true);
    ProcessMessage->setAttribute(Qt::WA_DeleteOnClose); 
    ProcessMessage->show();

    qApp->processEvents();

    processmethodONE();  
    processmethodTWO();
    processmethodTHREE();                  
}

void processmethodONE()
{
    QString ProcessCommand = "w8 " + blablubli";            

    Prozess.setWorkingDirectory(Path);         //QProcess "Prozess" is globaly defined  
    Prozess.setStandardOutputFile(Path);       //in my class

    QThread* thread = new QThread;
    Prozess.moveToThread(thread);
    Prozess.start(ProcessCommand);


while(!Prozess.waitForFinished(2000))
   {
       std::cerr << "Process running " << std::endl;
   }

QProcess::ExitStatus Status = Prozess.exitStatus(); 

if (Status == 0)
 {
   std::cout << "File created!" << std::endl;
 }
}

In diesem source-code, den ich versuchen, öffnen Sie ein popup-dialog, bevor einige Prozesse gestartet werden. problem ist, dass das Dialogfeld ist nicht anklickbar, sondern auf den dialog, ich möchte eine Schaltfläche erstellen, die zum Abbruch der Laufenden Methode. Wie Sie sehen können ich habe versucht, mit QThread den Vorgang ausführen(es) in einem anderen thread, aber noch kann ich nicht auf den dialog. Außerdem, wenn ich öffne meine Anwendung (GUI) mit der "application/x-executable"-file die Dialoge Inhalte fehlen, die bei der Aktivierung der oben gezeigten Methode. Wie kann ich diese Probleme beheben? Wo bin ich falsch? Grüße

  • Ich habe ein paar Fragen... 1) Wie rufst du Processmethod()? 2) Warum glauben Sie, dass müssen Sie erstellen eine QThread und bewegen Sie den QProcess hinein? Und auch, warum sind Sie dann nicht den Beginn des neuen QThread? 3) verwenden Sie diese Globale QProcess für alle Ihre processmethodX()?
  • es passt nicht mit der Frage, aber ich würde vorschlagen, Sie schreiben von Variablen-Namen in lowerCamelCase. Es ist sehr schnell lesbar. Aber ich Stimme mit jdi, benötigen Sie weitere Informationen zu beantworten.
  • Normalerweise gibt es keine Notwendigkeit zum ausführen von QProcess in einem thread, wie die API ist nicht blockiert, es sei denn, Sie verwenden die waitForStarted/Fertige Methoden.
  • Ich Wette, dass sobald die OP gibt uns die Antworten auf meine Fragen, wird es klar sein, dass es extra cruft hier (man wird richtig in nicht zu brauchen QProcess in einem thread)
  • 1)ich nenne Processmethod (), wenn eine Taste geklickt wird. 2)ich dachte, um die Ausführung des Prozesses in einem anderen thread würde verlassen Sie den dialog anklickbar/zur Verfügung. Du hast Recht ich habe nicht angefangen der QThread - mein Fehler - muss ich haben, um eine Verbindung-Methode und schließen Sie den thread auf eine Methode in der ich definieren Sie den Prozess? 3.Ich habe einen QProcess für jeden Prozess - wäre es besser, genau das gleiche wieder? Ich bin sorry für meine Fehler, aber ich hatte Probleme mit dem Verständnis der QThread Methoden wahrscheinlich weil mein Englisch ist nicht gut genug. @Frank: Wie Sie sehen können, ich benutze jetzt waitForFinished - bearbeitet meine Frage.
  • Ja, Sie sollten mit separaten QProcess Instanzen, so ist das in Ordnung. QThread würde es erlauben, den dialog am laufen zu halten, und so würde QProcess, aber nur, wenn Sie nicht gehen, und blockieren der Haupt-thread wartet für Sie zu beenden. Wählen Sie eine oder das andere: QThread, oder QProcess, und Ihre Signale zu sagen, Ihre Haupt-thread, wenn Sie fertig sind. Siehe die Antworten, die wir gegeben haben
  • Das problem ist, dass ich will, dass die Haupt-thread (GUI-Hauptfenster zu erfrieren in der Erwägung, dass die Prozesse ausgeführt werden, nur die popup-Dialogfeld angeklickt werden. Also, weiß jemand, wie das zu erreichen ist?

InformationsquelleAutor Streight | 2012-03-25
Schreibe einen Kommentar