大容量量数据插入CMFCListCtrl如何使界面不假死?

Fungyun 2012-04-09 10:02:21
是这样的,程序大概平均每秒要向list插入1000多条数据,是逐条插入,类似收到1条就向list插一条。原先逻辑是,开了一个工作线程是做接收、处理数据然后将得到的数据一条条sendmessage至listview窗口上,然后在主线程中进行InsertItem的操作,类似:
UINT MonitorDataThread(LPVOID lpVoid)
{

DWORD dwDCCount = GetDataCacheCount();//某一刻得到数据个数
for(DWORD dwDCIndex = 0; dwDCIndex < dwDCCount; ++dwDCIndex)
{
//处理得到数据
.......
//逐条发送数据
SendMessage(....);
}
}
然后在主线程中,
void UpdateView(MonitorViewData* pData)
{
InsertItem(....);//插入数据
}
现在的问题,这样的思路写出来的效果是,插入过程中界面卡死,插入完后才恢复正常。请问有没有很好的解决方案可以避免?有人说,可以考虑:数据和显示弱同步,数据更新可能是毫秒级别,List刷新则以秒级完成,但不知如何实现,谢谢指教
...全文
144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
公共马甲0315 2012-04-12
  • 打赏
  • 举报
回复

//the static callback function for your listctrl operation
// it could notify the main thread a message per every 100 items
LRESULT myfunc(LPVOID param)
{
CMyWnd* pWnd = (CMyWnd*)param;
//...
for(int i=1;i<=counts;i++)
{
pWnd->m_List.InsertItem(..);
//...
if(i%100 == 0)
postMessage(...,(WPARAM)i,0);
}
}
公共马甲0315 2012-04-12
  • 打赏
  • 举报
回复
呵呵,哪有在主线程里面做这个的?不卡才怪。
大量数据的io操作一般是放在子线程(单另创建一个)来完成的,主线程只是负责间隔地显示子线程当前的完成进度。
Fungyun 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

呵呵,哪有在主线程里面做这个的?不卡才怪。
大量数据的io操作一般是放在子线程(单另创建一个)来完成的,主线程只是负责间隔地显示子线程当前的完成进度。
[/Quote]
谢谢指教,但是原先程序的逻辑是来一条数据就插入一条,相当于我每插一次都要重新开一个界面线程来完成Insert的操作?如有10000条数据,开10000个界面线程?
「已注销」 2012-04-11
  • 打赏
  • 举报
回复
可以用listctrl的owner data特性
barech 2012-04-09
  • 打赏
  • 举报
回复
这种思路很好,但是为了解决闪屏的现象,还是需要采用先锁定list,然后间隔一段时间再更新的方法。
[Quote=引用 1 楼 的回复:]

你把SendMessage改成PostMessage试试。SendMessage会阻塞线程
[/Quote]
fengjunonline 2012-04-09
  • 打赏
  • 举报
回复
或者你换个思路看看呢,将数据放入一个队列,界面线程定时去获取数据
fengjunonline 2012-04-09
  • 打赏
  • 举报
回复
或者你尝试换一种思路,将数据放入一个队列里,在界面线程用一个定时器,间隔一段时间去获取数据。
fengjunonline 2012-04-09
  • 打赏
  • 举报
回复
你把SendMessage改成PostMessage试试。SendMessage会阻塞线程

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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