Ich entwickle eine GUI in QT, die einige starke Berechnungen basierend auf Benutzereingaben durchführt. Ich mache die ganze Berechnung in einer Funktion sagen start_computation(), wie start_computation() -Funktion aufgerufen wird meine GUI hängt, da es beschäftigt ist, Ausführen von start_computation() -Funktion. Also möchte ich QProgressBar verwenden, um den Benutzer wissen zu lassen, dass die GUI eine Aufgabe im Hintergrund ausführt.
Wie wird QProgressBar in diesem Fall am besten implementiert?wie QProgressBar für schwere Berechnung zu implementieren?
Antwort
Wenn die ganze komplexe Berechnung durch eine Funktion behandelt wird, kann sie leicht auf den QtConcurrent Rahmen portiert werden werden, so etwas wie die folgenden zu tun, wie im unten genannten tutorial verbunden: entsprechend der künftigen Beendigungsinformationen
QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction);
A FutureWatcher
Objekt wird dann den Fortschrittsbalken aktualisieren.
Es ist ein komplettes Beispiel dafür, wie QProgressBar mit QFutures und QtConcurrent im Allgemeinen verwenden hier: https://wiki.qt.io/Progress_Bar
Teilbeendigungsinformationen zu dem Fortschrittsbalken Des Hinzufügen trivial sein, die entsprechenden Informationen unter Verwendung des signals/slot
Mechanismus emittiert.
Ich weiß nicht, Ihr genaues Szenario aber wenn Ihre Berechnung eine Funktion (start_computation()
) ist, können Sie Faden und QThread
ist eine gute Lösung verwenden.
In der Tat müssen Sie Ihre Schwer-Berechnung in einen neuen Thread setzen. Dann können Sie den Berechnungsfortschritt vom Hauptthread (GUI) zu bestimmten Zeiten überprüfen und Ihren Fortschrittsbalken aktualisieren.
PS: einige Beispiele sehen QThread
in der rechten Weise der Umsetzung, die Sie this SO question und Here beziehen.
Der beste Weg, es zu tun ist, Ihre start_computation()
Funktion in einen eigenen Thread zu verschieben, dann mit dem signal/slot
Mechanismus die GUI korrekt zu aktualisieren. Die GUI muss immer auf dem Haupt-Thread laufen, und eine intensive Funktion wird das immer blockieren.
Es gibt eine gute Diskussion darüber, wie QThreads
richtig verwenden hier: http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/
Ich würde sagen, um zu vermeiden, mit 'QThreads' herumzuwühlen, wenn möglich. Es gibt eine nette gleichzeitige API in Qt, die vom QtConcurrent-Modul zur Verfügung gestellt wird, die bei dieser Art von Situation helfen kann. Vor allem, wenn es eine lang laufende Funktion gibt, die die schwere Arbeit erledigt und außerhalb des GUI-Threads ausgeführt werden muss. – alediaferia
Ich vergesse aus irgendeinem Grund immer 'QtConcurrent', aber es ist wahrscheinlich viel passender dafür. –
- 1. Schwere Berechnung in Django
- 2. Anpassen von QProgressBar
- 3. Need url Umschreibungen für die Mitgliedschaft Projekt zu implementieren oder kopieren - aber nicht wollen, schwere Rahmenprojekt
- 4. machen benutzerdefinierte QProgressBar
- 5. Intel Atom oder ARM für schwere Signalverarbeitungslast
- 6. Wie NTLM-Authentifizierung für UIWebView zu implementieren?
- 7. Schwere JavaScript-Berechnungen Block
- 8. Wie Fuzzy-String-Suche ohne eine schwere Datenbank zu tun?
- 9. Wie Speicherfehler zu bewältigen, während schwere CSV-Dateien
- 10. Wie schwere Abfrage als leichte und schnelle Version zu behandeln?
- 11. So steuern Sie QProgressBar mit Signal
- 12. SCHWERE: Ausnahme org.springframework.web.util.Log4jConfigListener
- 13. Wie zu implementieren Navigationsschublade
- 14. wie zu implementieren IXunitTestCollectionFactory
- 15. schwere numerische Dateneingabe UI-Muster?
- 16. Vorherrschende Berechnung für Zeichenfelder
- 17. Eine elegante Methode zum Implementieren von gemeinsamen Klassen, die schwere Ressourcen (in Java) laden
- 18. Implementieren der Berechnung in einer TCP-basierten Spielanwendung
- 19. Struts2 Tiles - wie zu implementieren?
- 20. neo4j graphity wie zu implementieren
- 21. Design-Muster: Null verwenden, um schwere Datenbankabfragen zu minimieren
- 22. wie zu implementieren java.lang.Classloader getResources()?
- 23. Schwere Formen zuvor eingegebenen Eintrag
- 24. MongoDB - Verwendung Multi-CPU-Server für einen Schreib schwere Anwendung
- 25. Wie log4j zu implementieren/zu verwenden?
- 26. Wie Clonable-Klasse zu implementieren?
- 27. wie Parallax Scrolling zu implementieren?
- 28. wie JavaScript-Vererbung zu implementieren
- 29. Clion wie Projekt zu implementieren?
- 30. Operator löschen - wie zu implementieren?
http://stackoverflow.com/questions/32952474/non-blocking-worker-interrupt-file-copy?lq=1 – dtech