为什么定时器里刷新CListCtrl会随着程序运行的时间的增加而闪动的越来越厉害

littlefangMFC 2009-07-19 11:07:23
我在定时器里刷新我的CListCtrl,但是随着程序运行时间的累加,CListCtrl刷新的闪动越来越厉害,请问是什么原因?有什么办法可以解决CListCtrl的刷新闪动问题。谢谢
...全文
249 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphi_911 2009-07-19
  • 打赏
  • 举报
回复
只对需要刷新的部分进行重画。
arong1234 2009-07-19
  • 打赏
  • 举报
回复
你多长时间刷新一次?
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 marrco2005 的回复:]
你可以在刷新之前
调用 SetRedraw( FALSE ) 关闭界面刷新

数据更新完之后再调用 SetRedraw ( TRUE );
最后调用 Invalidate
[/Quote]效果不明显啊
marrco2005 2009-07-19
  • 打赏
  • 举报
回复
你可以在刷新之前
调用 SetRedraw( FALSE ) 关闭界面刷新

数据更新完之后再调用 SetRedraw ( TRUE );
最后调用 Invalidate
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
问题补充:
1.我并没有大量是数据更新,只有5行5列数据,而且我没有用DeleteAllItems(),而用的是SetItemText()
2.只是在更新数据时判断了一下,数据是否需要更新,这其中进行了链表的遍历,所以可能消耗了一定的时间
3.我用的是从VCKBASE上下载的一个CListCtrl控件,不知道控件本身会不会对闪动造成影响
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wu_qing_yun 的回复:]
CListCtrl 重载了DrawItem吗? 在这里面画应该不会闪烁。 另外设置对话框的属性 WS_CLIPCHILDREN
[/Quote] 人家的类重载了DrawItem,为什么要设置WS_CLIPCHILDREN属性呢
wu_qing_yun 2009-07-19
  • 打赏
  • 举报
回复
CListCtrl 重载了DrawItem吗? 在这里面画应该不会闪烁。 另外设置对话框的属性 WS_CLIPCHILDREN
wu_qing_yun 2009-07-19
  • 打赏
  • 举报
回复
CListCtrl 重载了DrawItem吗? 在这里面画应该不会闪烁。 另外设置对话框的属性 WS_CLIPCHILDREN
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 schlafenhamster 的回复:]
排除下载的CListCtrl控件问题,用MFC的试试。有什么原因必须用下载的CListCtrl控件吗?
[/Quote]我需要设置不同单元格有不同的颜色等等
schlafenhamster 2009-07-19
  • 打赏
  • 举报
回复
排除下载的CListCtrl控件问题,用MFC的试试。有什么原因必须用下载的CListCtrl控件吗?
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 schlafenhamster 的回复:]
查查int nCount = m_arraySTSocketInfo->GetSize();
是不是越来越大!
[/Quote]不会的,最大值为5,我只有5个下位机
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhoujianhei 的回复:]
另外对话框要有WS_CLIPCHILDREN风格
或者属性设置中Clip Children = true
[/Quote]我试一下,能解释下原因吗
schlafenhamster 2009-07-19
  • 打赏
  • 举报
回复
查查int nCount = m_arraySTSocketInfo->GetSize();
是不是越来越大!
zhoujianhei 2009-07-19
  • 打赏
  • 举报
回复
另外对话框要有WS_CLIPCHILDREN风格
或者属性设置中Clip Children = true
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhoujianhei 的回复:]
  m_ListCtrl.SetRedraw(FALSE);
...
m_ListCtrl.SetRedraw(TRUE);
        m_ListCtrl.Invalidate();
        m_ListCtrl.UpdateWindow();
全去掉
[/Quote]去掉了也闪,加不加好像效果不明显的。开始的时候还闪的不是很厉害,程序运行一个小时以后明显看到闪的很厉害
zhoujianhei 2009-07-19
  • 打赏
  • 举报
回复
m_ListCtrl.SetRedraw(FALSE);
...
m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.Invalidate();
m_ListCtrl.UpdateWindow();
全去掉
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhoujianhei 的回复:]
具体还得看代码。
[/Quote]这是刷新表格的代码,有点乱哦
void CCMFD_Svr_MainFrameDlg::UpdateListCtrl()
{
CString sLCId;
CString sLCConnState;
CString sLCLastRevTime;
CString sDataAmount;
CString sLCIP;

try
{
m_ListCtrl.SetRedraw(FALSE);

POSITION pos = theApp.m_DataHandler.m_DataProcess.m_LCInfoList.GetHeadPosition();
int i=0;
while(pos != NULL)
{
STLCInfo *LCInfo = theApp.m_DataHandler.m_DataProcess.m_LCInfoList.GetNext(pos);
bool bLCConnect = false;

int nCount = m_arraySTSocketInfo->GetSize();
for (int j=0; j<nCount; j++)
{
if(bLCConnect)
break;
STClientConnInfo *pSTSocketInfoinArray = (STClientConnInfo*)m_arraySTSocketInfo->GetAt(j);
if(strcmp(pSTSocketInfoinArray->m_cClientIPaddr,LCInfo->sLCIP)==0)
{
sLCConnState = "通讯正常";
sDataAmount.Format("%d",pSTSocketInfoinArray->m_nRecvDataAmount);
sLCIP.Format("%s",pSTSocketInfoinArray->m_cClientIPaddr);
COleDateTime LastTime(pSTSocketInfoinArray->m_tRecvLastTime);
sLCLastRevTime = LastTime.Format(_T("%H:%M:%S"));

m_ListCtrl.SetItemTextColor(1,i,RGB(0,0,255));
m_ListCtrl.SetItemText(i,1,sLCConnState);
m_ListCtrl.SetItemText(i,3,sDataAmount);
m_ListCtrl.SetItemText(i,4,sLCLastRevTime);
bLCConnect = true;
}
}
if(!bLCConnect)
{
sLCConnState = "通讯中断";
m_ListCtrl.SetItemTextColor(1,i,RGB(0,0,255));
m_ListCtrl.SetItemText(i,1,sLCConnState);
}
//m_ListCtrl.SetItemTextColor(0,i,RGB(0,255,255));
i++;
}

m_ListCtrl.SetRedraw(TRUE);
m_ListCtrl.Invalidate();
m_ListCtrl.UpdateWindow();

}
catch(...)
{
m_pExceptionLog.WriteExceptionLog(-1,"CMFD_Svr_MainFrame","UpdateListCtrl()","","更新界面表格异常");
}
}
littlefangMFC 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]

可以增大一下间隔,看看是否有改善
[/Quote]哦,我发现GDI对象没有长,但是USER对象在增长
zhoujianhei 2009-07-19
  • 打赏
  • 举报
回复
具体还得看代码。
oyljerry 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 littlefangmfc 的回复:]
引用 6 楼 oyljerry 的回复:
是否刷新太频繁,还有随着时间,闪烁增加,是不是有资源泄漏,查看一下任务管理器的GDI对象等。
请问内存资源泄漏会造成随时间的增加闪烁越来越严重吗,能解释下原因吗
[/Quote]
如果泄露越来越多,绘图资源就不够,性能自然下降
加载更多回复(5)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧