我有大量的数据要插入(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
请各位兄弟指教!

解决方案 »

  1.   

    首先,在线程中插入的方法是好的,但不需要发送消息执行更新;
    如果插入位置是不确定的(比如排序插入),而且希望显示插入的条目,可以发送滚动消息:
    ctrl.PostMessage(WM_VSCROLL,SB_LINEUP,0);
    其中的参数SB_LINEUP有一组不同的值,用来决定滚动方式
      

  2.   

    to wangjinwang(王进) :试了一下不成功, 因为我插入的数据比较特别, 不是文字信息, 而是图片信息,
    就像acdsee中的缩略图, 所以图片一多, 这个速度就非常慢!不知道您的方法还有什么地方需要注意的?
      

  3.   

    好像ListView有一种Virtual模式,可以在需要显示的时候再载如对应的Item,不需要一次性全部载入,你可以使用Virtual模式,不需要多线程处理
      

  4.   

    to luogucai(萝卜):
        是的, listview有一种virtual 模式, 可以参见
        http://www.codeguru.com/listview/virtualListview.html
       
        但是我觉得这个模式还是不适合我, 因为我的时间大部分都消耗在图像处理上,
        也就是把.bmp, .jpg之类的文件转化成一个个的icon, 插入时间上就可以忽略不计, 
        virtual模式确实能减少插入时间, 所以我想我还是得用multithread
      

  5.   

    有一个想法,仅供参考:
    1、其实用户看到是不是当前插入的记录用户是感觉不到的,所以不如显示稍微滞后插入操作,即当前用户看到的实际上不是最新的,而是倒数第二或者第三条;
    2、显示命令可以用BOOL EnsureVisible( int nItem, BOOL bPartialOK );,这个可能效率高些;
    3、两个操作可以用两个线程,各做各事不知道能否实现,呵呵
      

  6.   

    to fengqinggao(风清高) :
    这个方法我已经试过了, 还是不行的说 :(
      

  7.   

    调用InsertItem后listview应该已经重绘了,没必要自己再刷新一边
    因为你调用的是图(可能是绘图影响了速度),最好把重绘关掉,这样快点
    添加线程:
    //关掉后,调用InsertItem不会重绘控件
    listview.Redraw(FALSE);
    ......
    for()InsertItem
    ......
    重绘一边
    listview.Redraw(TRUE);
      

  8.   

    sorry没看见后面的贴子.
    大量图的话肯定会慢的,acdsee也一样.
      

  9.   

    OK! It's a good idea.
    //如果把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);
    还有更好的方法吗?
      

  10.   

    1 virtual 模式
    2 缓存的图片格式应该是转成需要的大小的BMPCommand what is yours
    Conquer what is not