Läuft ein separater Prozess oder thread in Qt
Schreibe ich meine erste richtige nützliches Stück software. Ein Teil von denen sich der Benutzer ein Bild anzuzeigen, und die Wahl zu akzeptieren oder ablehnen. Dies bewirkt, dass das Bild gespeichert werden, um eine angenommene oder abgelehnte Ordner, und eventuell gedreht und/oder vergrößert werden.
Im moment, meine drehen/Größe ändern/speichern-operation ist das anhalten der Ausführung meines Programms, aber ich möchte es geschehen im hintergrund, so dass das nächste Bild wird sofort angezeigt.
Ist der einzige Weg, dies zu tun in Qt, um das Bild in einem separaten thread, oder gibt es einen anderen Weg? Ich bin noch dabei, meinen Kopf Runde C++ und Qt, also ich will nicht zu verwirren mich Tauchen Sie ein in ein neues Feld!
- Ein Wort der Warnung. Sie können nicht verwenden QPixmaps außerhalb des GUI-thread. Ich war vor kurzem gebissen von diesen ist eine ähnliche Gewinde-Bild-rendering-Typ Anwendung. Verwenden QImage statt. Wenn Sie wirklich brauchen ein QPixmap (die habe ich), wirst du zurückgeben müssen ein QImage aus dem thread und die Konvertierung (die ist Recht teuer) in der Haupt-GUI-thread.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Qt hat der thread-support. Vielleicht finden Sie diese Beispiel-Anwendung interessant, da es etwas ähnlich, was Sie beschreiben.
Auch, hier der gesamte Qt thread-Dokumentation.
diese Art von Aufgaben sind perfekt geeignet für threads. trotzdem sollten Sie zuerst eine 'normale' Funktion, die das tut, und wenn es funktioniert, fügen Sie einen thread, liest eine Warteschlange und ruft die gleiche Verarbeitung Funktion.
Qt hat eine Menge von Werkzeugen, um Ihnen zu helfen auf dieser, vor allem die Tatsache, dass die meisten der Container sind thread-sicher, und auch ein paar threading-algorithmen (wie z.B. map-reduce). noch, versuchen Sie zunächst synchron.
Bearbeitet
Sorry Leute, ich habe eine sehr harte Zeit, die Verbindung der "Warteschlange Benutzerdefinierte Typ "Beispiel", um den Anforderungen.
Soweit ich sagen kann, von der Frage, sobald der Benutzer akzeptiert oder abgelehnt das Bild muss es sein, optional auch gedreht und/oder skaliert und immer gespeichert, in ein bestimmtes Verzeichnis und gehen Sie zum nächsten Bild. (-> keine Interaktion mehr mit dem Benutzer)
Auch wenn der Benutzer verlässt den aktuellen dialog das Bild noch gespeichert werden.
Die in der "Warteschleife Benutzerdefinierte Typ "Beispiel" Griffe nur ein Bild, ist immer in Zusammenhang mit der gui, wenn der Benutzer das Dialogfeld zu schließen den thread-Betrieb gestoppt wird.
Also, wenn er startet sein Programm aus dem Beispiel in der Warteschlange, er wird wahrscheinlich anfangen zu schreiben ein mutex geschützte Bild-Warteschlange, so kann er hinzufügen neuer Bilder in die Liste, wenn es ausstehende speichern Operationen. Ansonsten wird der Benutzer immer noch warten auf anstehende Operationen.
Das zweite problem ist, dass er wahrscheinlich nicht wollen, zu warten auf ausstehende speichern Operationen, wenn der dialog geschlossen wird.
Was ich tun würde, um die Anforderungen zu erfüllen, ist die Arbeit mit dem thread-pool. Feed the thread pool den save Operationen, die Sie möchten, und verwenden Sie einen Dekorator-Muster basiert auf QRunnable wenn es auch sein muss, rotiert/skaliert. Alle queueing ' wird korrekt behandelt, die von der Bibliothek und ausstehenden Operationen ausgeführt werden, selbst wenn der Benutzer verlässt den aktuellen dialog.
Am Ende würde ich eventuell verwenden, die in der Warteschlange Beispielcode zum laden neuer Bilder und geben dem Benutzer eine Wartezeit-Anzeige für den Ladevorgang.
Meiner runnables und Lackierer würde wohl so Aussehen ... (vielleicht ein paar zusätzliche Konstruktoren, ersetzen Sie die set-Funktionen), so kann ich sehr leicht neue operation hinzufügen, wie dies
QThreadPool::globalInstance()->start(saver );
ohne Verwendung von low-level-synchronisation-Objekts.Entweder erstellen Sie einen separaten thread mit
QThread
oder verwenden threadpool worker-threads mitQRunnable
oder werfen Sie einen Blick auf hohem Niveau QtConcurrent-Klasse. Hier ist ein Beispiel für Bild-Skalierung.Einfachste Weg dies zu tun, ist die Verwendung QtConcurrent::run