VC++ CLR DataGridView 虛擬模式卡CPU問題
最近開發(fā)了一個數(shù)據(jù)解析程序,需要顯示10W+的設(shè)備數(shù)據(jù),采用了DataGridView 虛擬模式,效率非常高,但是使用中也遇到了一個奇葩的問題,微軟MSN上面好像沒有說到這個情況,比如我有10多列,界面默認只能顯示前面計列,只要你把滑動條向右拖動了,也就是最前面不是第0列時,就會出現(xiàn)CPU占用非常大情況,同時會出現(xiàn)MessageBox無法彈出等情況。
正常情況如上圖所示,CPU占用非常低。
只要把第一列擋住一點(向右拖動了滑條),此時CPU占用會瞬間變大,我的變?yōu)榱?4.2%,放到服務(wù)器上面會變成25%,根據(jù)CPU不同,占用會不一樣,總的來說,CPU越強,占用越低,同時界面會花掉。
但是奇葩的是,你只要把第0列顯示處理,一切都會恢復(fù),cpu占用也正常了,界面也正常了。
通過我不斷的測試,發(fā)現(xiàn)是只要拖動后,第0列沒有顯示處理,會一直觸發(fā)dataGridView2_CellValueNeeded事件,獲取最前面的那一列數(shù)據(jù)的值,但是我將此回調(diào)的數(shù)據(jù)一直返回為null后卻沒有這個問題,初步懷疑是需要將沒有顯示的列返回為null,接著進行測試。
最后找到問題原因是刷新了行號導(dǎo)致的
//DataGridView2?虛擬模式加載數(shù)據(jù)-用于主界面設(shè)備詳細信息顯示與操作 void?CLASS_NAME::DataGridView2_CellValueNeeded(System::Object^??sender,?System::Windows::Forms::DataGridViewCellValueEventArgs^??e) { static?int?LastRowIndex?=?-1; char?pStrBuff[512]; if?(this->isDisableRefreshDataGradView2?==?true) return; //禁止刷新DataGradView2 if?(sender?==?nullptr?||?e?==?nullptr)?return; try { if?(LastRowIndex?!=?e->RowIndex)?//行更新了,刷新行號 { char?DecimalBuff[32]; LastRowIndex?=?e->RowIndex; //顯示行號 sprintf_s(DecimalBuff,?32,?"%d",?e->RowIndex?+?1); this->dataGridView2->Rows[e->RowIndex]->HeaderCell->Value?=?CharToString(DecimalBuff); } e->Value?=?this->GetDataGridViewCellData(pStrBuff,?e->RowIndex,?e->ColumnIndex); //填充單元格 } catch?(Exception?^e) { SYS_LOG.Write(__FILE__?+?__LINE__?+?e->Message); } }
去掉了中間的行號更新后終于解決了問題。