VC++ CLR DataGridView 虛擬模式卡CPU問題
最近開發(fā)了一個數據解析程序,需要顯示10W+的設備數據,采用了DataGridView 虛擬模式,效率非常高,但是使用中也遇到了一個奇葩的問題,微軟MSN上面好像沒有說到這個情況,比如我有10多列,界面默認只能顯示前面計列,只要你把滑動條向右拖動了,也就是最前面不是第0列時,就會出現CPU占用非常大情況,同時會出現MessageBox無法彈出等情況。
正常情況如上圖所示,CPU占用非常低。
只要把第一列擋住一點(向右拖動了滑條),此時CPU占用會瞬間變大,我的變?yōu)榱?4.2%,放到服務器上面會變成25%,根據CPU不同,占用會不一樣,總的來說,CPU越強,占用越低,同時界面會花掉。
但是奇葩的是,你只要把第0列顯示處理,一切都會恢復,cpu占用也正常了,界面也正常了。
通過我不斷的測試,發(fā)現是只要拖動后,第0列沒有顯示處理,會一直觸發(fā)dataGridView2_CellValueNeeded事件,獲取最前面的那一列數據的值,但是我將此回調的數據一直返回為null后卻沒有這個問題,初步懷疑是需要將沒有顯示的列返回為null,接著進行測試。
最后找到問題原因是刷新了行號導致的
//DataGridView2?虛擬模式加載數據-用于主界面設備詳細信息顯示與操作
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);
}
}去掉了中間的行號更新后終于解決了問題。





