簡體   English   中英

問:如果你發出的信號太快會怎么樣?

[英]Qt: what happens if you send out signals too quickly?

情況如下:

  • 您有一個在后台線程中運行的長時間運行的計算。
  • 該計算每隔100毫秒發送一個信號以刷新GUI元素。
  • 假設它發出100個這樣的信號。
  • 重繪的小部件需要超過100毫秒才能重繪; 讓我們說1秒。

事件循環中會發生什么? 信號是否會“堆積”直到它們全部被執行(即100秒)? 是否有“丟棄”事件的機制?

永遠不會丟棄用戶事件。 如果排隊發出的信號事件的速度比處理它們的速度快,那么事件隊列將會增長,直到內存不足並且程序崩潰。 但值得注意的是,如果系統負載很重,QTimer將跳過超時事件。 在某種程度上,這可能有助於調節您的吞吐量。

您還可以考慮從一個線程向另一個線程發送反饋(可能是確認),並根據消費者線程的落后程度在生產者線程中手動調整您的時間。 或者,您可以使用隱喻大錘並切換到阻塞排隊連接。

在您的示例中,您可以在窗口小部件中測量繪圖時間。 如果繪圖需要240毫秒,那么您可以快速處理接下來的2個信號,而無需繪制任何內容。 這樣信號就不會堆積起來。

編輯:

實際上我的解決方案存在一些問題。 最后一個信號應該總是導致重繪,否則小部件在計算完成時會顯示錯誤的數據。

當跳過信號時,可以啟動單發定時器,例如以150ms的間隔。 當由於信號而重繪時,該計時器將被停止。 因此,在最后一次重繪信號之后,這個單次定時器將導致繪制最終狀態。 我想這會奏效,但會很復雜。

在計算開始時啟動一個簡單的計時器進行重繪很可能是一種更好的方法。 如果窗口小部件的繪制花費了大量時間,則可以根據繪制時間動態調整定時器間隔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM