AfxBeginThread创建线程,线程中去接收网络数据,接收到后发消息给主线程去更新列表,如果插入的数据项非常非常多,可以考虑那啥虚拟列表,百度去我也没用过这玩意儿
解决方案 »
- 文档视图结构中,新建一个按钮,一个文本框,点击按钮就把数据显示在文本框里。
- mfc求石问路
- 急急急!!!!请教,看看程序错哪了?? ADO链接mysql数据库问题
- 如何在VC++的菜單中加入自己的項呀?在中間加
- 进者有分:ADSL问题的探讨,顺便骂骂黑心的中国电信
- 请问本人违犯了哪条规则,以及于要被删贴?是否有版主想公报私仇?
- 对话框启动时的隐藏
- SMTP用协议可以传输附件是声音文件的邮件吗?下面的MSDN说的uuencode是什么格式?
- 怎样将 vc 中的一个字符串 传递到 vb 中???
- 关于new操作符的一个问题,急用!!!
- window文件API编译错误问题
- Recordset建立之后如何高效地把数据取出并显示在列表中?
解决问题要,
一、用 VirualList,
二、不要从子线程用 SendMessage 给主线程,应该用 PostMessage。(这应该才你造成你问题的原因)。
我用的是异步套接字CAsyncSocket,在网上查资料说,异步套接字没有必要使用线程,如果一定要用的话很麻烦。
我的列表控件是VirtualList,刷屏是正常的,只是刷屏的时候点击菜单打开模态对话框的时候,对话框没有弹出,此时程序假死,再点击别的都点不了,看上去模态对话框已经弹出了,只能用任务管理器结束程序。
我现在没有使用线程,列表控件用的是VirtualList,列表控件内容的动态显示是正常的,因为数据量很大,列表控件一直在不停地刷新数据,此时点击菜单打开模态对话框,对话框没有弹出,程序出现假死,点击别的都没反应,好像模态对话框已经弹出,只能通过任务管理器结束程序。
程序假死时,列表控件还在正常地更新数据。
给你出一个歪门邪道的思路吧。
如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
用AfxBeginThread启动一个工作者线程还是用户界面线程呢?应该用工作者线程吧。增加子线程会存在一些问题,比如套接字是在主线程中创建的,子线程不能直接使用,切换上下文才能使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。高手啊,听君一席话,感觉豁然开朗。我的应用程序主要处理两大块,一块是网络的发送和接收,另一块是数据库的操作。
用户配置的数据写入数据库,切换界面的时候再把数据读出并显示出来,另外做了一个发送数据的界面,单击按钮之后从数据库中取出数据并通过网络发送出去。接收来自网络的数据写入数据库并在VirtualList列表中动态显示,在报表界面可以查询这些数据。像我这种情况,增加几个线程比较合理?怎么对线程分工?