是这样的,程序大概平均每秒要向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(....);//插入数据
}
现在的问题,这样的思路写出来的效果是,插入过程中界面卡死,插入完后才恢复正常。请问有没有很好的解决方案可以避免?

解决方案 »

  1.   

    一秒1000多条,List可能受不了的,数据的累积需要消耗大量内存
    大量数据为什么不分页显示呢?没有可以直接看到上千条记录的屏幕吧:)
      

  2.   

    分页显示了的,当前List框内可显示出的条数为30,如果你要看之前或后面的内容,是通过右边的下拉条上下拉动可看。
    可不可以做成table页的list,每一个list只显示那么多条,超过了自动开一个table页继续显示。
      

  3.   

    PostMessage更好楼上说的很好,我也觉得可以缓存一下,需要时再实际插入
      

  4.   


    List的数据插入/绘制,都比较耗费时间
    多个table可以考虑
    也可以考虑:数据和显示弱同步,数据更新可能是毫秒级别,List刷新则以秒级完成一般情况下,数据是数据,显示是显示,两者逻辑上分开
    显示一般是交互态比较好
    如果想展示程序在快速运行中的样子,那么可以整一个酷酷的Static在界面上...
      

  5.   

    问题的本质是,数据与显示逻辑上分开,不把所有的数据都放置在显示容器里
    你接收数据的时候,只与数据容器打交道,比如1秒1000,这是没有办法的,根据速率,选择合适的方法你的显示容器,只能放有限的数据(比如5000行的List,不会老年痴呆的),这个List定时到数据容器中取数据,刷新(比如每两秒取最新的100条展示)。为了展示数据快速吞吐的状态,可以做一个Static,它的更新成本极低,可以同步一条数据(PostMessage),眼花缭乱的效果瞧,你的项目中有三个关键点
    1、数据容器:吞吐数据,后台线程
    2、传输展示:同步一条数据,供观察
    3、列表显示:定时刷新N条最新数据,供阅读
      

  6.   

    谢谢OK1234567的指教,但对于你提到的第三个关键点“定时刷新N条最新数据(如每两秒取最新的100条展示)”,那这样的话,我最终List上呈现的数据是不完整的咯?类似,我一共只有2S接收并显示数据,照这样每2S显示最新100条,而我本来2S存在数据容器的条数是2000条,结果list只有100条数据呀,之前的数据没有显示出来?
      

  7.   

    或者改成用每来一条数据就开启一个界面线程来Insert,但这样假如数据量多了,线程数也随之多了?
      

  8.   

    你要做实时显示吗?每秒1千条,用户根本看不过来。只能看到屏幕一直在刷,数据根本就看不到嘛。没有实际意义啊。
    如果不用做实时显示,那可以插入前先调用一下SetRedraw(false)把列表刷新功能关掉,插完之后再调用SetRedraw(true)更新。或者可以根据策略,插入一定数量后刷新一下。系统默认每插入一条数据都刷新的
      

  9.   

    在线程中 sendmessage 后 Sleep() 是不是可以呢