2014-09-25 72 views
0

我目前使用DataGridView以表格格式顯示我的數據。它有5列。如何在Windows窗體中實現快速更新表?

Problem:我收到的數據速度非常快,比如5毫秒。我使用BlockingCollection從一個線程存儲數據,並通過從不同線程獲取數據來更新表。由於數據進入的速度非常快,發生的情況是隊列的大小不斷增加。

當我停止發送數據時,DataGridView不斷添加行,理想情況下應停止發送數據。

我試圖實現一個線程安全循環隊列,但沒有奏效,我錯過了很多消息。

是否有任何其他控件可以使用,而不是DataGridView這是非常快的?

或者如果有人能告訴我如何更好地實施它?

+0

您是否在添加下一個塊之前附加行或清除整個網格? – 2014-09-25 10:56:36

+3

您是否逐一向datagridview添加新項目?最好做一些兌現,並通過包(例如100行)將數據添加到網格... – Yuriy 2014-09-25 10:56:56

+0

您提到您「通過*獲取*數據更新表」,因此如果「數據進入的速度非常快快速「,減慢您獲取數據的節奏。 – chiccodoro 2014-09-25 10:57:55

回答

2

很可能您的限制因素是更新DataGridView,並且創建更快的隊列不會對您有所幫助。例如,你的描述表明您更新循環看起來是這樣的:

while (queue not empty) 
{ 
    get queue item 
    update data grid 
} 

每次更新數據網格,還有一些運行並很可能嘗試更新屏幕布局邏輯。這是一項非常昂貴的操作。如果在每次插入後必須更新屏幕,幾乎肯定DataGridView無法跟上每秒200條記錄的插入速率。

我建議的第一件事是批量更新DataGridView,在批次開始前調用SuspendLayout,在批次結束時調用ResumeLayout。所以,你的循環變得這樣的事情:

int MaxItemsPerBatch = 10; 

while (queue not empty) 
{ 
    grid.SuspendLayout(); 
    int numItems = MaxItemsPerBatch; 
    while (numItems > 0 && queue not empty) 
    { 
     get item from queue 
     update data grid 
     numItems = numItems - 1 
    } 
    grid.ResumeLayout(); 
} 

這裏,佈局邏輯只有每批次運行一次,所以你應該是10倍的速度。這仍然會使您每秒更新20次屏幕更新速度,這將比您的用戶看到的更快。您可能可以將批量增加到100,而不會有任何用戶推遲。

+0

感謝您的建議。它提高了表更新速度。仍然我錯過了很多消息,我想這將是因爲我使用的循環隊列實現。你能不能與我分享線程安全循環隊列的最佳代碼? – ankur 2014-09-26 10:02:36

+0

@ankur:我的建議是使用'BlockingCollection'。我確切知道'BlockingCollection'可以輕鬆處理每秒超過200條記錄的入隊和出隊。這不是「最理想的」,但速度非常快,效果很好。我懷疑你的限制因素仍然是'DataGridView' UI更新。你嘗試增加批量大小嗎? – 2014-09-26 14:14:54

+0

是的,你說得對,先生,我遇到了'DataGridView'的麻煩。截至目前,我使用普通的「隊列」和暫停佈局,直到滾動事件發生在表中。它有點改進了用戶界面,但我需要做得比這更好。 – ankur 2014-09-30 14:54:45