Ich habe ein Worker-Thread in meiner Anwendung, die gelegentlich Informationen erhält, die schnell in QML UI angezeigt werden sollte. Wenn ich einen solchen Teil der Information habe, sende ich ein Signal aus, das von einem Objekt empfangen wird, das im UI-Thread lebt.Qt-Signale erreichen UI-Thread mit spürbarer Verzögerung
Ich möchte diesen Prozess sehr reaktionsschnell sein, so dass Änderungen in QML UI so schnell wie möglich angezeigt werden (dies ist wichtig, weil Worker Thread externen Controller behandelt, und ich möchte den kürzesten "kritischen Pfad" zwischen Benutzerinteraktion mit Controller und Benutzeroberfläche ändern).
Allerdings habe ich festgestellt, dass der Zeitunterschied zwischen emit signal()
und Slot im UI-Thread immer 20-40 Millisekunden aufgerufen wird. Warum?
Was kann ich tun, um dies zu beschleunigen? Ich habe versucht, QCoreApplication::processEvents()
in Worker-Thread zu rufen, nachdem das Signal ausgegeben wird, aber das ändert kaum etwas.
Einige Gedanken:
- Kann ich nennen
processEvents
aber für irgendwie UI-Thread? - Verwenden Sie ein Ereignis mit hoher Priorität anstelle eines Signals. Wird es helfen?
OS: Win8.1, Qt 5.5
QCoreApplication :: processEvents ist für die Ereignisschleife des UI-Threads vorgesehen. Sende mehr Code über Signalverbindung, Slot-Handler, UI-Laufschleife. – hiitiger
Angesichts der Tatsache, dass QML mit der Aktualisierungsrate des Bildschirms aktualisiert, haben Sie eine 16.6ms Verzögerung bei 60Hz Bildwiederholfrequenz * sowieso *. Eine Verzögerung von 20 ms ist normal und eine Verzögerung von 40 ms ist auch nicht falsch. Dein Benutzer kann das sowieso nicht sagen, also was ist das Problem. Was versuchst du zu machen? BTW, 'processEvents' wird fast nie richtig geschriebenen Code benötigt. Du brauchst es definitiv nicht. –