大家好,我在用VC做一个上位机数据解析软件,上位机使用LIBUSB 来接收下位机传输的数据,我在LIBUSB读线程里面解析数据,这些数据都有固定的格式 一帧一帧传上来的,解析之后我再把这些数据填充进LISTCTR里面,LISTCTRL 第一列是变量名,大概有30个变量左右,后面是该变量的内容,变量内容不时的刷新,填充数据项都是用m_listctrl.SetItemText() 这个函数进行填充,现在发现在我的笔记本上当帧率超过800时,整个程序变的很慢,有些帧已经显示的不对,在台式机上帧率超过1400,程序已经反映很慢,点击程序上的一些BUTTON 要很久才反应过来,此时在任务管理器里面看该程序的CPU占用率 基本上已经到了百分之30左右,我也试过ListCTRL的虚拟列表,改善不明显,感觉是刷新太快,LISTCTRL 填充耗费了大量的时间,不知道各位论坛的大神们有没有好点方法来处理这个问题,关键就是怎么让LISTCTRL 填充时间减短,或者还有没有其他更好的控件来处理此类问题?

解决方案 »

  1.   

    如果你在线程里直接调
    m_listctrl.SetItemText() 
    想不卡都不行,因为你没有留时间片区响应其它消息了.
    Threadfunction
    {
    Sleep(10);   //一定要睡眠一下自己,分点时间片给主线程;}而且还有一个问题,m_listctrl插入那么多数据,实际上用户只看一部分数据的。也就是说你可以实际上把接收的数据存下来,等用户翻查的时候显示一个page,不用一下插入1400条吧,有点吓人。而且体验也不好吧。改成14 *100    或者  28 * 50  不是更好吗? 每次只显示一部分
      

  2.   

    实际上 这个列表一共也就30多行,一页就能全部显示,只是每一行的数据在不停的变化,我要实时观察这些数据,并不是要分页查看,我是在LIBUSB  读线程里填充,只是LIBUSB 不停的在收数据,不然LIBUSB读线程应该是能阻塞的,感觉如果像tajon1226 说的,在延迟10ms,恐怕实时性会更差,不知道我的理解对不对?
      

  3.   

    m_list.SetRedraw(FALSE);
    //增加内容
    XXXX
    //更新内容
    m_list.SetRedraw(TRUE);
      

  4.   

    刷新太快没什么意义,所有数据全部收集齐了,通知窗口从内存刷新ListCtrl