2011-09-19 77 views
0

我仍然掌握C Sharp和.NET,我正在研究一個應用程序來顯示數據不斷從USB設備讀取。我有所有的USB代碼工作,它每5ms接收一次數據更新。數據由多個單位的一組傳感器值組成,例如50個單位,每個單位有12個傳感器。最有效的方式來顯示我的數據快速流體更新

當前我正在使用ListBox對象來顯示50行數據。我將列表框模式設置爲OwnerDrawFixed,將我的數據源設置爲表示從USB設備讀取的數據的對象數據數組(每列ListBox有一個對象),並使用DrawItem事件以圖形方式繪製每行列表框請求列表框(我這樣做,以啓用文字着色,格式,整潔的佈局等)。

爲了讓ListBox刷新正在顯示的數據,我打電話定期調用Invalidate來強制重繪,但這是非常慢的,即使在低頻率下閃爍也是不可接受的,比如1秒更新,任何接近5ms刷新傳感器的地方。

任何人都可以提出一個更好的方法來更新屏幕上的數據,也許一個我不是每次都繪製所有東西,或者可能是一種方式來告訴ListBox只重繪一行可能如果該行上的數據已經改變?

不管怎樣,我並沒有被綁定到一個ListBox上,它只是我對.Net框架的陌生 - 也許最好的解決方案可能是將所有東西都渲染成位圖,然後通過一個單獨的動作將它移動到屏幕上。

我已經閱讀過類似的問題,但在那裏的建議並沒有真正幫助... c# - fast ListBox data update

由經驗豐富的.NET開發人員的任何其他建議不勝感激...

回答

1

的繼承ListBox控件和啓用雙緩衝,我認爲,你最好的選擇。我不知道ListBox如何繪製,但應該減少閃爍。

(如果不起作用,黑客攻擊是對角作廢只有一小矩形,並希望它油漆正確。這很可能不會與原來的控件集工作,雖然。)

+0

謝謝,我會看看成。 –

1

在不知道自己在做什麼的情況下提出建議非常困難。你可以解釋你的「數據」,「傳感器值」和「單位」是什麼。一般來說,圖形比大量的數字列表更適合顯示大型數據集。

如果這是某種瞬態數據,比如聲音強度,那麼您可以考慮使用VU米類型的顯示器,就像在音樂播放器中一樣。

如果您試圖追蹤趨勢或變化,請考慮sparkline或圖表。

如果您試圖顯示數據之間的相關性,請考慮譜圖或XY圖。

+0

數據以客戶端請求的格式顯示。它主要是由少數幾個十進制數字,一些十六進制數字,然後是一些標誌組成的文本,目前我正在顯示一個X或 - 字符(雖然這些可能很容易是圖形等)。我不能真正改變佈局,因爲客戶端要求的佈局非常像佈置行和列的電子表格。 –

+0

我一定要小心,不要說任何違反我的NDA的內容,但將數據視爲50個設備,每個設備都顯示設備編號(0到49 - 即列表框中的行),序列號的設備,然後使用多個標誌來表示傳感器上的開關是打開還是閉合。每個設備都是相同的,因此客戶請求了電子表格樣式表格。 –

1

在WPF中,您可以在beginig處填充ListBox,然後將數據發送到佈局acynchronosly。 如果它的可用的WPF你應該嘗試。當你持續地記錄數據項時,代碼會變得更加複雜。

1

對於那些對我工作的解決方案感興趣的人,他們都可以無閃爍地快速閃爍。

我只是使用Panel控件在設計視圖中表示我的表,然後在我的代碼中我有一個方法每隔1ms就由一個計時器觸發(儘管實際上我似乎無法獲得比每個16ms - 我猜可能是因爲我正在做一個圖形化的blit而與監視器的60hz vsync刷新相關聯)。

我抓住面板的邊界,創建一個匹配大小的位圖,使用各種圖形命令(比如DrawString)將位圖繪製到位圖上,然後將結果位圖傳送給面板控件。如果隨後在調整面板大小並調整相應的位圖大小時隨後調整窗口大小,這很好。

這也工作得很快,實際上沒有比以前使用列表控件的緩慢/閃爍解決方案更多的工作,但要注意的是,不支持選擇行等(因爲這個應用程序只使用一個ListBox來顯示數據)。

我現在正在認真考慮迷你技術人員對未來列表框工作的建議,因爲此工作非常好,並且繼承ListBox(而不是基於Panel控件)將允許我繼承某些行選擇內容等

感謝所有的建議, 豐富

相關問題