2016-03-28 346 views
0

我的應用程序中有一個工作線程,偶爾會收到應該快速顯示在QML UI中的信息。當我有這樣的信息部分時,我發出信號,這是由UI線程上的對象接收的。Qt信號到達UI線程明顯延遲

我希望這個過程能夠非常快速地響應,以便儘可能快地在QML UI中顯示更改(這很重要,因爲工作線程處理外部控制器,並且我希望用戶與控制器交互的最短「關鍵路徑」 UI更改)。

但是我發現,emit signal()和在UI線程中調用的槽之間的時間差總是20-40毫秒。爲什麼這樣?

我能做些什麼來加速這個?信號發射後我在工作線程中嘗試調用QCoreApplication::processEvents(),但這幾乎沒有改變任何東西。

的幾點思考:

  • 我可以打電話processEvents但不知何故UI線程?
  • 使用具有高優先級的事件代替信號。它會有幫助嗎?

OS:Win8.1,Qt的5.5

+0

QCoreApplication :: processEvents用於UI線程的事件循環。發佈更多關於信號連接,插槽處理程序,UI運行循環的代碼。 – hiitiger

+0

鑑於QML以刷新率刷新,您將在60Hz刷新率下有16.6ms的延遲*無論如何*。 20ms的延遲是正常的,40ms的延遲也是錯誤的。你的用戶無論如何都說不清,那麼問題是什麼。你想做什麼?順便說一句,'processEvents'幾乎不需要任何正確書寫的代碼。你絕對*不需要它。 –

回答

0

當你發出從工作線程UI線程的信號,它被放入UI事件隊列,當事件隊列泵和交付達到那個信息。如果你的工作線程比你的UI線程的優先級更高,那麼UI線程將不得不等待工作線程阻塞。如果工作者線程具有相同的優先級,則它將完成它的時間量,可能是20ms。你可以讓你的信號直接連接而不是排隊,然後你需要自己處理線程安全。

+0

「UI線程必須等到工作線程阻塞」 - 這些信息來自哪裏?線程並行執行 –

+0

如果您的工作線程的優先級高於您的UI線程,那麼UI線程將不得不等待,直到工作線程阻塞。 – dgsomerton

+0

@Alexey Andronov:「線程並行執行」不是在單個核心繫統上,即使在多核上,信號/時隙消息傳遞也需要同步 –