C++ 项目中工作线程通信,使用全局变量合理吗?

clearaelc 2014-08-12 03:09:38
C++ 类似TCP/IP这样的项目,工作线程没有窗口过程
1.主线程通知工作线程,有什么合理的做法或者说规范习惯?使用全局变量合理吗?

2.工作线程收到消息,合理的做法是工作线程直接输出到主界面的控件 还是工作线程发送消息给主界面,由界面线程(主线程)来输出到主界面的控件?如果是后者,我为消息申请内存,然后由界面线程使用并释放,这样的做法合理吗?

3.我见一些程序的窗口过程,每个消息调用函数处理时,函数的参数都有hWnd窗口句柄,这部分函数如此紧密,为什么不用全局变量,减少传递呢?我看MFC封装的一些API常常省略了这个窗口句柄,它是怎么做的?

或者给我一个有参考价值的TCP/IP开源项目也行。

接触项目太少了,问题有点多,不甚感激!
...全文
626 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nextseconds 2014-08-12
  • 打赏
  • 举报
回复
引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下 1.就是你提到的全局变量 2.event事件 3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage 4.工作线程封装成线程类,主线程去操作线程类对象 后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题 句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
赵4老师 2014-08-12
  • 打赏
  • 举报
回复
《Windows核心编程》
zhousitiaoda 2014-08-12
  • 打赏
  • 举报
回复
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下 1.就是你提到的全局变量 2.event事件 3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage 4.工作线程封装成线程类,主线程去操作线程类对象 后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题 句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
Cnwanglin 2014-08-12
  • 打赏
  • 举报
回复
引用 楼主 clearaelc 的回复:
C++ 类似TCP/IP这样的项目,工作线程没有窗口过程 1.主线程通知工作线程,有什么合理的做法或者说规范习惯?使用全局变量合理吗? 2.工作线程收到消息,合理的做法是工作线程直接输出到主界面的控件 还是工作线程发送消息给主界面,由界面线程(主线程)来输出到主界面的控件?如果是后者,我为消息申请内存,然后由界面线程使用并释放,这样的做法合理吗? 3.我见一些程序的窗口过程,每个消息调用函数处理时,函数的参数都有hWnd窗口句柄,这部分函数如此紧密,为什么不用全局变量,减少传递呢?我看MFC封装的一些API常常省略了这个窗口句柄,它是怎么做的? 或者给我一个有参考价值的TCP/IP开源项目也行。 接触项目太少了,问题有点多,不甚感激!
1. 需要看设计框架, 如果是小程序,全局变量也是可以的 2.是发消息给主线程,由它来维护. 消息量不大的时候,可以这么做 3.全局变量的设计在面向对象中要少用, 工程大的时候会带来很多麻烦 下面那个问题,我建议你多看看MFC方面的书,是很好理解的 比如 void CUseMFCLibFrame::OnPaint() { CPaintDC dc(this); dc.TextOut(40,150,"hello!This is a example for how to create application"); } 还是基础有所欠缺,需要反复看书
lx624909677 2014-08-12
  • 打赏
  • 举报
回复
可以把线程函数做成类的友元函数
shiguojie19892 2014-08-12
  • 打赏
  • 举报
回复
我一般就是直接传给控件去显示或者动作,没遇到什么不妥呀
神奕 2014-08-12
  • 打赏
  • 举报
回复
在MFC中,线程函数最好不要直接处理主UI程序的控件,而是应该发送消息给主窗口,由主程序统一处理。 这时候你需要添加自定义消息。
满衣兄 2014-08-12
  • 打赏
  • 举报
回复
引用 8 楼 clearaelc 的回复:
[quote=引用 5 楼 zhousitiaoda 的回复:] 全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下 1.就是你提到的全局变量 2.event事件 3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage 4.工作线程封装成线程类,主线程去操作线程类对象 后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题 句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?[/quote] new+postmessage timer
zhousitiaoda 2014-08-12
  • 打赏
  • 举报
回复
还是可以通过发送消息,或者定义一个list/vector,子线程把数据放进去,主线程去容器里取,这个要注意下同步。还可以用共享内存,具体百度。
clearaelc 2014-08-12
  • 打赏
  • 举报
回复
引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下 1.就是你提到的全局变量 2.event事件 3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage 4.工作线程封装成线程类,主线程去操作线程类对象 后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题 句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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