AfxBeginThread创建线程,线程中去接收网络数据,接收到后发消息给主线程去更新列表,如果插入的数据项非常非常多,可以考虑那啥虚拟列表,百度去我也没用过这玩意儿

解决方案 »

  1.   

    问题不在于增加线程,
    解决问题要,
    一、用 VirualList,
    二、不要从子线程用 SendMessage 给主线程,应该用 PostMessage。(这应该才你造成你问题的原因)。
      

  2.   


    我用的是异步套接字CAsyncSocket,在网上查资料说,异步套接字没有必要使用线程,如果一定要用的话很麻烦。
    我的列表控件是VirtualList,刷屏是正常的,只是刷屏的时候点击菜单打开模态对话框的时候,对话框没有弹出,此时程序假死,再点击别的都点不了,看上去模态对话框已经弹出了,只能用任务管理器结束程序。
      

  3.   


    我现在没有使用线程,列表控件用的是VirtualList,列表控件内容的动态显示是正常的,因为数据量很大,列表控件一直在不停地刷新数据,此时点击菜单打开模态对话框,对话框没有弹出,程序出现假死,点击别的都没反应,好像模态对话框已经弹出,只能通过任务管理器结束程序。
    程序假死时,列表控件还在正常地更新数据。
      

  4.   

    AfxBeginThread线程去解决,界面本身就是一个线程,如果他再接收数据时候会一直不停接收程序会卡死哪里,你用AfxBeginThread去解决
      

  5.   

    算了,看样子你对线程如何建立使用啥的也不是特别了解
    给你出一个歪门邪道的思路吧。
    如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
      

  6.   


    用AfxBeginThread启动一个工作者线程还是用户界面线程呢?应该用工作者线程吧。增加子线程会存在一些问题,比如套接字是在主线程中创建的,子线程不能直接使用,切换上下文才能使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
      

  7.   


    线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
      

  8.   


    线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。
      

  9.   


    线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。高手啊,听君一席话,感觉豁然开朗。我的应用程序主要处理两大块,一块是网络的发送和接收,另一块是数据库的操作。
    用户配置的数据写入数据库,切换界面的时候再把数据读出并显示出来,另外做了一个发送数据的界面,单击按钮之后从数据库中取出数据并通过网络发送出去。接收来自网络的数据写入数据库并在VirtualList列表中动态显示,在报表界面可以查询这些数据。像我这种情况,增加几个线程比较合理?怎么对线程分工?