我有大量的数据要插入(about 100000), 需求就是要插一条显示一条,
这样客户感觉就不是很慢。
所以我采用了多线程的方法, 用另外一个线程hInsertThread, 其执行为:for(int i=0; i<100000; i++)
{
......
ctrlTree.InsertItem(...);
SendMessage(m_hMainWnd, WM_UPDATELIST, i, 0);
i++;
}
然后当主线程收到自定义的消息WM_UPDATELIST后去刷新listview,
但是好像没有效果的, 代码如下:
GetListCtrl().Update(nItem); //nItem为消息的i
请各位兄弟指教!
这样客户感觉就不是很慢。
所以我采用了多线程的方法, 用另外一个线程hInsertThread, 其执行为:for(int i=0; i<100000; i++)
{
......
ctrlTree.InsertItem(...);
SendMessage(m_hMainWnd, WM_UPDATELIST, i, 0);
i++;
}
然后当主线程收到自定义的消息WM_UPDATELIST后去刷新listview,
但是好像没有效果的, 代码如下:
GetListCtrl().Update(nItem); //nItem为消息的i
请各位兄弟指教!
如果插入位置是不确定的(比如排序插入),而且希望显示插入的条目,可以发送滚动消息:
ctrl.PostMessage(WM_VSCROLL,SB_LINEUP,0);
其中的参数SB_LINEUP有一组不同的值,用来决定滚动方式
就像acdsee中的缩略图, 所以图片一多, 这个速度就非常慢!不知道您的方法还有什么地方需要注意的?
是的, listview有一种virtual 模式, 可以参见
http://www.codeguru.com/listview/virtualListview.html
但是我觉得这个模式还是不适合我, 因为我的时间大部分都消耗在图像处理上,
也就是把.bmp, .jpg之类的文件转化成一个个的icon, 插入时间上就可以忽略不计,
virtual模式确实能减少插入时间, 所以我想我还是得用multithread
1、其实用户看到是不是当前插入的记录用户是感觉不到的,所以不如显示稍微滞后插入操作,即当前用户看到的实际上不是最新的,而是倒数第二或者第三条;
2、显示命令可以用BOOL EnsureVisible( int nItem, BOOL bPartialOK );,这个可能效率高些;
3、两个操作可以用两个线程,各做各事不知道能否实现,呵呵
这个方法我已经试过了, 还是不行的说 :(
因为你调用的是图(可能是绘图影响了速度),最好把重绘关掉,这样快点
添加线程:
//关掉后,调用InsertItem不会重绘控件
listview.Redraw(FALSE);
......
for()InsertItem
......
重绘一边
listview.Redraw(TRUE);
大量图的话肯定会慢的,acdsee也一样.
//如果把ctrlTree.Redraw()函数放在循环里面, 这个就每次对listctr进行刷新,
//效果就不是很好了, 因为非常的闪烁
for(int i=0; i<100000; i++)
{
......
ctrlList.Redraw(FALSE);
ctrlList.InsertItem(...);
ctrlList.Redraw(TRUE);
i++;
}//如果把ctrlTree.Redraw()函数放在循环外面,
//这样就是最后插完了之后把一次性显示出来,
//用户还是有感觉程序显示太慢
ctrlList.Redraw(FALSE);
for(int i=0; i<100000; i++)
{
......
ctrlList.InsertItem(...);
i++;
}
ctrlList.Redraw(TRUE);
还有更好的方法吗?
2 缓存的图片格式应该是转成需要的大小的BMPCommand what is yours
Conquer what is not