应用程序很卡,怎么增加线程?没分了,请各位帮忙

我在这儿等你 工程师  2014-01-09 11:37:02
MFC应用程序,界面上有一个列表控件,负责显示从网络接收的数据,当数据量很大时,列表控件不停地刷屏,此时单击菜单打开一个模态对话框,对话框没有弹出,再点击别的,都点不了,好像模态对话框已经弹出,列表控件依然在刷屏。
这是怎么回事呢?是不是单线程只能处理一个任务呢?能否通过增加线程解决这个问题呢?
没分了,请各位指点,谢谢
...全文
128 点赞 收藏 11
写回复
11 条回复
我在这儿等你 2014年01月11日
还没找到好的方法,结贴
回复 点赞
我在这儿等你 2014年01月10日
引用 9 楼 lvxinjian_cn 的回复:
[quote=引用 8 楼 zgguoqing 的回复:] [quote=引用 6 楼 lvxinjian_cn 的回复:] 算了,看样子你对线程如何建立使用啥的也不是特别了解 给你出一个歪门邪道的思路吧。 如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。 [/quote] vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。[/quote] 高手啊,听君一席话,感觉豁然开朗。我的应用程序主要处理两大块,一块是网络的发送和接收,另一块是数据库的操作。 用户配置的数据写入数据库,切换界面的时候再把数据读出并显示出来,另外做了一个发送数据的界面,单击按钮之后从数据库中取出数据并通过网络发送出去。接收来自网络的数据写入数据库并在VirtualList列表中动态显示,在报表界面可以查询这些数据。 像我这种情况,增加几个线程比较合理?怎么对线程分工?
回复 点赞
lvxinjian_cn 2014年01月10日
引用 8 楼 zgguoqing 的回复:
[quote=引用 6 楼 lvxinjian_cn 的回复:] 算了,看样子你对线程如何建立使用啥的也不是特别了解 给你出一个歪门邪道的思路吧。 如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。 [/quote] vc我个人感觉是这样,主对话框的作用是显示和接收用户鼠标或键盘输入,然后建议编程人员建立各种线程来实现真正的后台工作。根据你的程序,建议主程序主要是负责显示,然后建立新的线程来负责接收数据,线程接收到数据后,发给主程序显示,这样主程序就会一直得到不同的消息响应(消息如刷新,单击界面按钮等等)。
回复 点赞
我在这儿等你 2014年01月10日
引用 6 楼 lvxinjian_cn 的回复:
算了,看样子你对线程如何建立使用啥的也不是特别了解 给你出一个歪门邪道的思路吧。 如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
线程我以前用过简单的,如果增加一个线程,那是不是要把网络接收和VirtualList的刷新放在这个线程里?如果这样,会存在一些问题,异步套接字是在主线程中创建的,切换上下文才能在子线程中使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
回复 点赞
我在这儿等你 2014年01月10日
引用 5 楼 u010588063 的回复:
AfxBeginThread线程去解决,界面本身就是一个线程,如果他再接收数据时候会一直不停接收程序会卡死哪里,你用AfxBeginThread去解决
用AfxBeginThread启动一个工作者线程还是用户界面线程呢?应该用工作者线程吧。增加子线程会存在一些问题,比如套接字是在主线程中创建的,子线程不能直接使用,切换上下文才能使用,主线程和子线程都要用到该套接字,来回切换可能会出现问题。
回复 点赞
dahaiI0 2014年01月09日
AfxBeginThread创建线程,线程中去接收网络数据,接收到后发消息给主线程去更新列表,如果插入的数据项非常非常多,可以考虑那啥虚拟列表,百度去我也没用过这玩意儿
回复 点赞
lvxinjian_cn 2014年01月09日
算了,看样子你对线程如何建立使用啥的也不是特别了解 给你出一个歪门邪道的思路吧。 如果数据量的别大,你的VirualList显示列表控件不停地刷屏是没有意义的,因为你只能看到不停的刷屏,实际内容啥也看不到。所以显示没意义,所以就是,不显示了,把收到的内容写日志就完了,好多大的程序都是不显示,有的连个界面都没有,查东西都是去日志里看。
回复 点赞
u010588063 2014年01月09日
AfxBeginThread线程去解决,界面本身就是一个线程,如果他再接收数据时候会一直不停接收程序会卡死哪里,你用AfxBeginThread去解决
回复 点赞
我在这儿等你 2014年01月09日
引用 2 楼 RobertBaker 的回复:
问题不在于增加线程, 解决问题要, 一、用 VirualList, 二、不要从子线程用 SendMessage 给主线程,应该用 PostMessage。(这应该才你造成你问题的原因)。
我现在没有使用线程,列表控件用的是VirtualList,列表控件内容的动态显示是正常的,因为数据量很大,列表控件一直在不停地刷新数据,此时点击菜单打开模态对话框,对话框没有弹出,程序出现假死,点击别的都没反应,好像模态对话框已经弹出,只能通过任务管理器结束程序。 程序假死时,列表控件还在正常地更新数据。
回复 点赞
我在这儿等你 2014年01月09日
引用 1 楼 dahaiI0 的回复:
AfxBeginThread创建线程,线程中去接收网络数据,接收到后发消息给主线程去更新列表,如果插入的数据项非常非常多,可以考虑那啥虚拟列表,百度去我也没用过这玩意儿
我用的是异步套接字CAsyncSocket,在网上查资料说,异步套接字没有必要使用线程,如果一定要用的话很麻烦。 我的列表控件是VirtualList,刷屏是正常的,只是刷屏的时候点击菜单打开模态对话框的时候,对话框没有弹出,此时程序假死,再点击别的都点不了,看上去模态对话框已经弹出了,只能用任务管理器结束程序。
回复 点赞
LiuYinChina 2014年01月09日
问题不在于增加线程, 解决问题要, 一、用 VirualList, 二、不要从子线程用 SendMessage 给主线程,应该用 PostMessage。(这应该才你造成你问题的原因)。
回复 点赞
发动态
发帖子
进程/线程/DLL
创建于2007-09-28

6376

社区成员

4.9w+

社区内容

VC/MFC 进程/线程/DLL
社区公告
暂无公告