关于mfc异步调用线程的问题

moonk-z 2017-11-29 10:09:34
手头有个小项目,功能不算复杂,就是一个导入导出功能。
函数处理的时候都放在btnClick里面的话,界面会无响应直到完成处理。
因为涉及导出功能,数据量有上万的list和vector的stl,
考虑到这种传参的程度,使用什么方式异步调用会好点?

线程,std::async,io_service->post?
感觉都绕不开这个不小的传参,有没有既能后台处理又能避免这种列表的拷贝的方法?
...全文
653 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2017-11-30
  • 打赏
  • 举报
回复
可以考虑线程池
赵4老师 2017-11-30
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
moonk-z 2017-11-30
  • 打赏
  • 举报
回复
11L的方法可行,已修改到func类
引用 14 楼 smwhotjay 的回复:
耗时导致ui阻塞了,解决办法就是开线程。 OnClick就开工作线程,修改工作状态为进行中。(比如设置在lable上显示) 工作线程完成了就SendMessage 给窗口 定义个WM_USER+ xxx 为导出完成消息。 窗口消息里把这个消息处理下,弹出窗口提示,什么的,你自己看着办
试了一下这种方式, 但开启线程只能为全局函数(不想这样用)或者静态函数,使用静态函数的话不方便跨类调用sendmessage, 用自己添加的Dlg->SetStaticText()的接口去控制控件。 网上看到说传窗口为参数时,最好不要sendmessage,不太明白为啥。。
引用 15 楼 tajon1226 的回复:
可以考虑线程池
那请问这个线程池是大致怎么个实现法?
csulizhang 2017-11-29
  • 打赏
  • 举报
回复
引用 7 楼 u012072837 的回复:
[quote=引用 5 楼 zhangli00 的回复:] 别总想着拷贝,直接传数据地址就行了,开线程处理是最好的,c++11的新特性里面,开线程非常简单了,而且可以操作类成员变量,存储和读取都非常方便,在同一个类里面的话,传都不用传,直接调用
其实就是不想在同个类里面做,因为发起请求的是界面,想把这块分离到逻辑类里面做[/quote] 分出来也可以呀,你在逻辑类里面开线程,操作逻辑类的数据,UI调用的时候直接通过逻辑类的成员变量实现,这个好像没什么问题吧 我做视音频数据都是这种方法搞得,感觉很方便,而且关键是可以把类实例化成多个对象,各自在各自的线程里面跑,互不干扰,现在除了回调需要全局的或者友元,其他都可以封装在类里面实现了
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 4 楼 zgl7903 的回复:
线程中可以给UI投递消息
请问这里说的线程是指c风格的thread吗?
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 5 楼 zhangli00 的回复:
别总想着拷贝,直接传数据地址就行了,开线程处理是最好的,c++11的新特性里面,开线程非常简单了,而且可以操作类成员变量,存储和读取都非常方便,在同一个类里面的话,传都不用传,直接调用
其实就是不想在同个类里面做,因为发起请求的是界面,想把这块分离到逻辑类里面做
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
[quote=引用 2 楼 u012072837 的回复:] [quote=引用 1 楼 zgl7903 的回复:] onBnclick 中启动后台线程, 再启动一个定时器监视后台线程运行情况
那这里还是绕不开list的拷贝啊?[/quote] 你只要保证list的生命期,可以传指针等过去。[/quote] 好,我试试
csulizhang 2017-11-29
  • 打赏
  • 举报
回复
别总想着拷贝,直接传数据地址就行了,开线程处理是最好的,c++11的新特性里面,开线程非常简单了,而且可以操作类成员变量,存储和读取都非常方便,在同一个类里面的话,传都不用传,直接调用
zgl7903 2017-11-29
  • 打赏
  • 举报
回复
线程中可以给UI投递消息
oyljerry 2017-11-29
  • 打赏
  • 举报
回复
引用 2 楼 u012072837 的回复:
[quote=引用 1 楼 zgl7903 的回复:] onBnclick 中启动后台线程, 再启动一个定时器监视后台线程运行情况
那这里还是绕不开list的拷贝啊?[/quote] 你只要保证list的生命期,可以传指针等过去。
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
onBnclick 中启动后台线程, 再启动一个定时器监视后台线程运行情况
那这里还是绕不开list的拷贝啊?
zgl7903 2017-11-29
  • 打赏
  • 举报
回复
onBnclick 中启动后台线程, 再启动一个定时器监视后台线程运行情况
smwhotjay 2017-11-29
  • 打赏
  • 举报
回复
耗时导致ui阻塞了,解决办法就是开线程。 OnClick就开工作线程,修改工作状态为进行中。(比如设置在lable上显示) 工作线程完成了就SendMessage 给窗口 定义个WM_USER+ xxx 为导出完成消息。 窗口消息里把这个消息处理下,弹出窗口提示,什么的,你自己看着办
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 11 楼 zhangli00 的回复:
C++11开线程很简单的 std::thread tt(&ClassName::FunName, this); tt.detach(); 上面就是基本结构,如果你的FunName方法带有参数,就在this后面加参数就行了,如: void FunName(int i,int j); std::thread tt(&ClassName::FunName, this,1,2); 至于detach和join,自己可以百度看看区别,根据需求选择
已用 AfxBeginThread((AFX_THREADPROC)mergeFun, (LPVOID)this, THREAD_PRIORITY_IDLE); 处理,但还是在mfc窗口类中 我试下你的方法。
csulizhang 2017-11-29
  • 打赏
  • 举报
回复
我上面的FunName方法可不是全局方法,是在ClassName这个类里面的成员函数
csulizhang 2017-11-29
  • 打赏
  • 举报
回复
C++11开线程很简单的 std::thread tt(&ClassName::FunName, this); tt.detach(); 上面就是基本结构,如果你的FunName方法带有参数,就在this后面加参数就行了,如: void FunName(int i,int j); std::thread tt(&ClassName::FunName, this,1,2); 至于detach和join,自己可以百度看看区别,根据需求选择
moonk-z 2017-11-29
  • 打赏
  • 举报
回复
引用 9 楼 zhangli00 的回复:
[quote=引用 7 楼 u012072837 的回复:] [quote=引用 5 楼 zhangli00 的回复:] 别总想着拷贝,直接传数据地址就行了,开线程处理是最好的,c++11的新特性里面,开线程非常简单了,而且可以操作类成员变量,存储和读取都非常方便,在同一个类里面的话,传都不用传,直接调用
其实就是不想在同个类里面做,因为发起请求的是界面,想把这块分离到逻辑类里面做[/quote] 分出来也可以呀,你在逻辑类里面开线程,操作逻辑类的数据,UI调用的时候直接通过逻辑类的成员变量实现,这个好像没什么问题吧 我做视音频数据都是这种方法搞得,感觉很方便,而且关键是可以把类实例化成多个对象,各自在各自的线程里面跑,互不干扰,现在除了回调需要全局的或者友元,其他都可以封装在类里面实现了[/quote] 好像也对,那请问下是用什么类型的线程实现的?我只用过最基本的thread join的模式,而且也是全局函数,总觉得这种方式不优雅。

15,980

社区成员

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

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