是这样的:
我做了个模拟服务器里面开了300个线程,每个线程的工作就是连续向客户端发送600条数据,每数据包大约200字节,间隔一秒后重复前面动作(即连续发送N条数据);
在客户端接到数据后马上通过消息通知界面,界面根据消息提取数据刷新界面某列表的数据,这样发现CPU上到100%,且界面一直打不开不响应.后来我将刷新界面列表数据放线程里处理(即来一消息开一线程,线程数狂增到接近2000),界面可以打开但鼠标响应超慢在晃动,CPU依然100%.这个问题应该怎样解决啊,望各位指点指点啊,跪谢了!!!

解决方案 »

  1.   

    有几种方法解决:
    第一、是最笨的方法,但是,很实用,界面每过N秒刷新一次,不用接到数据就刷新!
    第二、当接到数据的时候,发消息给界面,通知界面刷新,这里面要求界面每次刷新前,要将所有的要求刷新的消息清空,MFC支持这种取消息方法的!
    第三、建一个管理刷新的工具类,用这个类来管理,具体方法,自己定!
      

  2.   

    写一个类似VB里DoEvents的方法,如:
    MSG msg;
    while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))  
    {   
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
    }
      

  3.   

    是这样的,比如我在解析线程里解析了一数据然后我将此数据以new个数据结构,通过消息(自定义消息)发送给界面处理类如CMYVIEW,然后在CMYVIEW里的接收消息处理函数里(OnRecv)根据对应的消息获得发送过来的数据结构,调用组件(里面有显示数据的列表控件)更新数据的方法刷新数据.
    而根据楼上说的:每次刷新的时候,已经收到好多数据了,将这些数据一次刷新出来,好象不可行,因为每次的数据都不同,比如第一个数据对应的是列表控件里第一行的数据,而第二个又可能是对应列表最后一行,第三个接收的数据有可能在列表中没有与之匹配的行就不用更新了,所以第二种方法我想应该不适合了.
    简化伪代码:
    在数据解析线程:
    DATA *pData=new DATA
    pMyView->postmessage(WM_DATA,REALDATA,(LPARAM)pData)在CMYVIEW的OnRecv
    case REALDATA:
        pdata=(DATA*)lParam
        刷新数据
      

  4.   

    300*600*200 = 36,000,000byte=34.3M
    再者,看你如何理解实时的概念了.对于某些情况来说,一小时刷新一次可以认为是实时,某些时候1秒刷新一次可以认为是实时,有时候1毫秒也不见得是实时.这就看你系统对时间的要求了.