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





