2017-05-03 1 views
0

Ich mache einen Render-Job-Manager für den Mixer. Ich habe eine Klasse, die eine Reihe von Renderjobs aufbaut und dann auf Start klickt und sie nacheinander mit einer Schleife rendert. Mein Problem ist, dass die waitForFinished() Methode mein ganzes Programm hält. Aber ich habe gelesen, dass Sie QThread mit QProcess nicht verwenden sollten.Ist dies ein angemessener Zeitpunkt, QThread mit QProcess zu verwenden?

So funktioniert die Schleife.

do{   
if(myProcess->state() == QProcess::NotRunning) { 

      myProcess->setProgram(blenderPath); 
      myProcess->setArguments(arguments); 
      myProcess->start(); 
      myProcess->waitForFinished(-1); 

      //Get rid of current rendering job to prepare for the next job 
      renderQueueList.pop_front(); 
     } 

     }while(renderQueueList.empty() != true); 

Kann ich einen separaten Thread verwenden, um QProcess zu starten, und was wäre der beste Weg, dies zu tun? Ich habe gelesen, dass Sie eine Zusammenfassung von QThread machen oder Signale und Slots verwenden, aber es ist so verwirrend, besonders wenn ich Argumente an den Prozess übergeben muss.

Vielen Dank.

Edit: Ich möchte hinzufügen, dass der Prozess vor dem Ausführen eines neuen Prozesses abgeschlossen werden muss. Es muss in Ordnung gehen. Deshalb denke ich, dass ich den Prozess in einem eigenen Thread ausführen muss.

+1

Warum hören Sie nicht einfach das 'finished()' Signal? – MrEricSir

+0

@MrEricSir Sie sind richtig .... Hier ist ein Artikel http://www.qtcentre.org/threads/26067-Article-How-to-QProcess-in-QThread – Naidu

+0

Ich bin verwirrt. Der Artikel zeigt, wie man einen Prozess in einem neuen Thread erstellt, aber die Kommentatoren sagen, das ist schlecht. Welches ist es? – LetTheWritersWrite

Antwort

1

QProcess wird bereits in einem anderen Prozess ausgeführt, d. H. Asynchron mit Ihrer Anwendung.

Wenn Sie waitForFinished() aufrufen, wird die Anwendung gesperrt, bis der Prozess in QProcess beendet ist. Sie müssen stattdessen die fertigen() und wahrscheinlich errorOccured() Signale verbinden, und dann läuft Ihre Anwendung weiter, während QProcess im Hintergrund läuft.

Sie müssen diese Schleife ändern, um zu überprüfen, dass die Warteschlange nicht leer ist und ein neuer Prozess mit dem finished() - Signal beginnt.

Wenn Sie einen QThread ausführen, der QProcesses ausführt und waitForFinished() abwartet, werden Sie zwar den Hauptanwendungs-Thread freigeben, aber es ist ein sinnloser zusätzlicher Layer, wenn QProcess bereits asynchron ist und Sie() wissen lassen getan, ohne einen Thread zu sperren, sei es der UI-Thread oder ein separater Thread.

+0

Ich sehe, ich muss auf das Signal '' beendeten() 'des Prozesses zugreifen. Ich habe gerade erkannt, dass 'QProcess :: NotRunning' nicht einmal in meinem Code funktioniert. Ich habe irgendwo gelesen, dass ich das könnte, aber es ist völlig falsch. Also, was Sie vorschlagen, ist eine rekursive Verbindung, die meine Funktion nach jedem Ende zu starten, und innerhalb meiner Funktion habe ich nur eine if-Anweisung, um die QList zu überprüfen, wenn leer. Könnten Sie mir helfen, eine Verbindung herzustellen? Ich kann nicht verstehen, was die Ärzte sagen. Sie verwenden ein Lambda und geben nicht einmal an, ob ich ein Objekt oder irgendetwas für die Herstellung einer Verbindung erstellen muss. – LetTheWritersWrite

+0

Ich habe herausgefunden, wie man die Verbindung erstellt und habe meinen Code oben als ein Slot und ruft es rekursiv auf. Perfekt gearbeitet! Ich habe die 'do while'-Schleife losgeworden und sie durch eine if-Anweisung ersetzt, um die renderQueueList zu überprüfen, wenn sie leer ist, bevor der Prozess erneut gestartet wird. Vielen Dank! – LetTheWritersWrite

Verwandte Themen