2016-03-28 3 views
0

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

+0

QCoreApplication :: processEvents ist für die Ereignisschleife des UI-Threads vorgesehen. Sende mehr Code über Signalverbindung, Slot-Handler, UI-Laufschleife. – hiitiger

+0

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. –

Antwort

0

Wenn man ein Signal von einem Arbeiter-Thread auf den UI-Thread emittiert, wird es in die UI Ereigniswarteschlange gesetzt und geliefert wird, wenn die Ereigniswarteschlange gepumpt wird, und erreicht diese Nachricht. Wenn Ihr Worker-Thread eine höhere Priorität als Ihr UI-Thread hat, muss der UI-Thread warten, bis der Worker-Thread blockiert. Wenn der Arbeitsthread die gleiche Priorität hat, wird er seine Zeitquanten vervollständigen, was 20ms sein kann. Sie können Ihr Signal dazu bringen, Direct statt Queue zu verbinden, und dann müssen Sie sich selbst um die Thread-Sicherheit kümmern.

+0

"UI-Thread muss warten, bis der Worker-Thread blockiert" - woher diese Informationen stammen? Threads werden parallel ausgeführt –

+0

Wenn Ihr Worker-Thread eine höhere Priorität als Ihr UI-Thread hat, muss der UI-Thread warten, bis der Worker-Thread blockiert. – dgsomerton

+0

@Alexey Andronov: "Threads ausführen parallel". Nicht auf einem Single-Core-System, und auch auf Multicore die Signal/Slot Message Passing erfordert Synchronisation. –

Verwandte Themen