2013-07-24 38 views
2

我正在製作一個GUI,我在QStackedWIdget上有多個表單。現在我希望這些表單中的數據在可用時更新。數據將通過RTI DDS接收。有人可以向我建議一些示例或鏈接,其中GUI數據從非GUI線程更新。Qt和RTI DDS交互---需要一些指導

謝謝。

回答

2

您有多種選擇可供選擇。就我所能評估的問題而言,我會解釋一個似乎最適合你情況的方法。

首先您需要知道的是,在用戶端,您的應用程序和DDS DataReaders之間存在三種不同類型的交互:輪詢,偵聽器和等待設置。輪詢基本上意味着您的應用程序在需要時查詢DataReader,例如以固定的速率查詢。使用監聽器意味着您的應用程序爲中間件提供了一些回調函數,每當新數據到達時都會調用它們。等待設置類似於套接字select,其中您的應用程序線程被阻塞,直到數據到達或發生超時爲止 - 通常後面是訪問DataReader的操作。

對於GUI應用程序,通常使用輪詢機制而不是您可能使用的偵聽器方法。而不是在數據到達時讀取數據,並立即更新GUI小部件,您可以讓GUI以固定速率讀取或從DataReader獲取數據,例如5 Hz。

通過這種方法,您可以控制訪問DDS的時間,無論數據讀取器中的數據更新速度有多快,您都可以按照所需的確切速率執行操作。此外,由於您從您自己的上下文訪問DDS DataReader,您的數據由非GUI線程更新的問題得到解決。

使用輪詢的一個潛在的缺點可能是更新的部件發生了一些延遲,例如,如果您在5 Hz輪詢,您的最大額外延遲將是200毫秒。儘管這對GUI應用程序來說通常不是問題。

+0

我們正在處理的一些數據需要實時處理。處理關鍵數據的延遲將影響我們的應用程序。所以請建議比投票更好的解決方案。 – Sid411

+0

對於需要高響應性的數據,可以使用waitset,它的工作方式類似於套接字「select」。您的線程阻塞,直到數據可用。當它解鎖時,您可以讀取或獲取數據。但是,這些數據的性質聽起來不像您典型的GUI數據。你確定你想在GUI應用程序中做這種實時處理嗎? –

+0

是的,它不是一個GUI應用程序。 GUI僅用於顯示我們將要從現場接收的數據。將有一個用於GUI的線程將更新接收到的數據。 – Sid411