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

我在这儿等你 2014-01-09 11:37:02
MFC应用程序,界面上有一个列表控件,负责显示从网络接收的数据,当数据量很大时,列表控件不停地刷屏,此时单击菜单打开一个模态对话框,对话框没有弹出,再点击别的,都点不了,好像模态对话框已经弹出,列表控件依然在刷屏。
这是怎么回事呢?是不是单线程只能处理一个任务呢?能否通过增加线程解决这个问题呢?
没分了,请各位指点,谢谢
...全文
169 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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。(这应该才你造成你问题的原因)。

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧