2009-09-09 22 views
1

我已經參與構建一個定製QGIS應用程序,其中應用程序的查看器上將顯示實時數據。QGIS中的QTimer發射問題(Quantum GIS)

正在使用的IPC是unix消息隊列。

數據將以指定的間隔(例如3秒)刷新。

現在我面臨的問題是,要顯示的數據的處理需要超過3秒,所以我所做的是,在應用程序開始處理數據以進行下一次更新之前,刷新QTimer停止,並在數據處理後,我再次重新啓動QTimer。應用程序應該以這樣一種方式工作,更新/刷新後(刷新期間應用程序無響應),用戶應該有足夠的時間繼續工作該應用程序除了看到數據被更新之外。我能夠獲得可接受的停頓供用戶使用 - 在一種情況下。

但是在不同的操作系統上(RHEL5.0到RHEL5.2),情況有些不同。定時器變得瘋狂並且繼續啓動而沒有給出任何暫停,因此連續更新因此進入無限循環。處理這個更新數據肯定需要超過3秒,但因爲這個原因,我已經停止了 - 在處理時重新啓動計時器。同樣的邏輯在一種情況下工作,而在其他情況下不起作用。另一個我觀察到的事實是,當這個快速定時器的觸發發生在刷新函數退出所用的時間非常短,abt 300ms,因此我在這個函數的開始和結束處放置的定時器的啓動 - 停止發生在那個小時間。數據的實際處理結束,在等待執行的隊列中有3-4個啓動的計時器,並且因此無限循環問題從該點變得更差每次連續更新。

這裏需要注意的重要一點是,對於一個OS中的相同代碼,刷新時間顯示爲大約4000ms(相同數據量所需的實際處理時間),而其他OS則爲300ms。

也許這與更新的操作系統上的新庫有關...但我不知道如何調試它,因爲我無法得到任何線索,爲什麼它發生這樣的事情......也許與pthreads有關的東西有改變了操作系統?

所以,我的問題是,有沒有什麼辦法可以確保我的應用程序中的一些處理是時間控制的(而且與OS無關),而不使用QTimer,因爲我認爲QTimer不是一個很好的選擇來實現什麼我想要??

可以有什麼選擇? pthreads或Boost線程?哪一個會更好,如果我是使用線程作爲替代??但我怎麼能確保至少3/2的差距b/w連續更新,無論更新處理需要多長時間?

請幫忙。

謝謝。

+0

我認爲其他缺陷是計時器的停止 - 啓動命令在由該非常QTimer本身的觸發導致的執行代碼內 即當下一個執行週期的停止 - 啓動語句被執行QTimer對於正在執行的那個週期是有效的,由此產生的任何不良影響,還有什麼建議?實際上,這個刷新功能不僅僅是由於定時器被觸發,而且在觀看者的縮放/平移時被調用,所以我不得不停止數據處理用戶放大/縮小的時間以保持應用程序的響應,並且可以避免段錯誤 – ashishsony 2009-09-09 17:55:18

回答

1

如果我試圖得到一個可接受的長期解決方案,我會調查更新您的顯示在一個單獨的線程。在該線程中,您可以將顯示器繪製爲圖像,儘可能經常地更新,儘管您可能想要限制線程,以便它不會佔用所有可用的處理時間。然後在UI線程中,您可以讀取該圖像並將其繪製到屏幕上。這可以提高您對平移的響應速度,因爲您可能會顯示圖像的不同部分。您可以基於計時器每3秒更新一次圖像(只需從源代碼重新繪製),或者可以在新數據完全刷新時讓其他線程發出信號。

+1

...或者說,您是否在另一個線程中工作 - UI *必須*在* main *線程中更新。否則,這是要走的路。這聽起來像你在做什麼是計算昂貴 - 除非你可以優化它的整個負載,你會有UI凍結,除非你把它放在一個單獨的線程。 – Thomi 2009-09-10 07:29:36