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

时间:2022-02-09 13:00:57
C++ 类似TCP/IP这样的项目,工作线程没有窗口过程
1.主线程通知工作线程,有什么合理的做法或者说规范习惯?使用全局变量合理吗?

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

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

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

接触项目太少了,问题有点多,不甚感激! C++ 项目中工作线程通信,使用全局变量合理吗?

10 个解决方案

#1


在MFC中,线程函数最好不要直接处理主UI程序的控件,而是应该发送消息给主窗口,由主程序统一处理。

这时候你需要添加自定义消息。

#2


我一般就是直接传给控件去显示或者动作,没遇到什么不妥呀

#3


可以把线程函数做成类的友元函数

#4


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

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

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

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

接触项目太少了,问题有点多,不甚感激! C++ 项目中工作线程通信,使用全局变量合理吗?


1. 需要看设计框架, 如果是小程序,全局变量也是可以的
2.是发消息给主线程,由它来维护. 消息量不大的时候,可以这么做
3.全局变量的设计在面向对象中要少用, 工程大的时候会带来很多麻烦
下面那个问题,我建议你多看看MFC方面的书,是很好理解的

比如
void CUseMFCLibFrame::OnPaint()
{
 CPaintDC dc(this);
 dc.TextOut(40,150,"hello!This is a example for how to create application");
}

还是基础有所欠缺,需要反复看书

#5


全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了


#6


《Windows核心编程》

#7


引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
C++ 项目中工作线程通信,使用全局变量合理吗?

#8


引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了

感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?

#9


还是可以通过发送消息,或者定义一个list/vector,子线程把数据放进去,主线程去容器里取,这个要注意下同步。还可以用共享内存,具体百度。

#10


引用 8 楼 clearaelc 的回复:
Quote: 引用 5 楼 zhousitiaoda 的回复:

全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了

感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?

new+postmessage
timer

#1


在MFC中,线程函数最好不要直接处理主UI程序的控件,而是应该发送消息给主窗口,由主程序统一处理。

这时候你需要添加自定义消息。

#2


我一般就是直接传给控件去显示或者动作,没遇到什么不妥呀

#3


可以把线程函数做成类的友元函数

#4


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

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

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

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

接触项目太少了,问题有点多,不甚感激! C++ 项目中工作线程通信,使用全局变量合理吗?


1. 需要看设计框架, 如果是小程序,全局变量也是可以的
2.是发消息给主线程,由它来维护. 消息量不大的时候,可以这么做
3.全局变量的设计在面向对象中要少用, 工程大的时候会带来很多麻烦
下面那个问题,我建议你多看看MFC方面的书,是很好理解的

比如
void CUseMFCLibFrame::OnPaint()
{
 CPaintDC dc(this);
 dc.TextOut(40,150,"hello!This is a example for how to create application");
}

还是基础有所欠缺,需要反复看书

#5


全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了


#6


《Windows核心编程》

#7


引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
C++ 项目中工作线程通信,使用全局变量合理吗?

#8


引用 5 楼 zhousitiaoda 的回复:
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了

感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?

#9


还是可以通过发送消息,或者定义一个list/vector,子线程把数据放进去,主线程去容器里取,这个要注意下同步。还可以用共享内存,具体百度。

#10


引用 8 楼 clearaelc 的回复:
Quote: 引用 5 楼 zhousitiaoda 的回复:

全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象

后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题

句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了

感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?

new+postmessage
timer