1.主线程通知工作线程,有什么合理的做法或者说规范习惯?使用全局变量合理吗?
2.工作线程收到消息,合理的做法是 工作线程直接输出到主界面的控件 还是 工作线程发送消息给主界面,由界面线程(主线程)来输出到主界面的控件?如果是后者,我为消息申请内存,然后由界面线程使用并释放,这样的做法合理吗?
3.我见一些程序的窗口过程,每个消息调用函数处理时,函数的参数都有hWnd窗口句柄,这部分函数如此紧密,为什么不用全局变量,减少传递呢?我看MFC封装的一些API常常省略了这个窗口句柄,它是怎么做的?
或者给我一个有参考价值的TCP/IP开源项目也行。
接触项目太少了,问题有点多,不甚感激!
10 个解决方案
#1
在MFC中,线程函数最好不要直接处理主UI程序的控件,而是应该发送消息给主窗口,由主程序统一处理。
这时候你需要添加自定义消息。
这时候你需要添加自定义消息。
#2
我一般就是直接传给控件去显示或者动作,没遇到什么不妥呀
#3
可以把线程函数做成类的友元函数
#4
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里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
#6
《Windows核心编程》
#7
![C++ 项目中工作线程通信,使用全局变量合理吗? C++ 项目中工作线程通信,使用全局变量合理吗?](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OW1iM0oxYlM1amMyUnVMbTVsZEM5UWIybHVkRVp2Y25WdEwzVnBMM05qY21sd2RITXZZM05rYmk5UWJIVm5hVzR2TURBekwyMXZibXRsZVM4eUxtZHBaZz09.jpg?w=700&webp=1)
#8
感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?
#9
还是可以通过发送消息,或者定义一个list/vector,子线程把数据放进去,主线程去容器里取,这个要注意下同步。还可以用共享内存,具体百度。
#10
new+postmessage
timer
#1
在MFC中,线程函数最好不要直接处理主UI程序的控件,而是应该发送消息给主窗口,由主程序统一处理。
这时候你需要添加自定义消息。
这时候你需要添加自定义消息。
#2
我一般就是直接传给控件去显示或者动作,没遇到什么不妥呀
#3
可以把线程函数做成类的友元函数
#4
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");
}
还是基础有所欠缺,需要反复看书
#5
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
#6
《Windows核心编程》
#7
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
![C++ 项目中工作线程通信,使用全局变量合理吗? C++ 项目中工作线程通信,使用全局变量合理吗?](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OW1iM0oxYlM1amMyUnVMbTVsZEM5UWIybHVkRVp2Y25WdEwzVnBMM05qY21sd2RITXZZM05rYmk5UWJIVm5hVzR2TURBekwyMXZibXRsZVM4eUxtZHBaZz09.jpg?w=700&webp=1)
#8
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?
#9
还是可以通过发送消息,或者定义一个list/vector,子线程把数据放进去,主线程去容器里取,这个要注意下同步。还可以用共享内存,具体百度。
#10
全局变量当然能用,但尽量少用。主线程通知工作线程有几种方法如下
1.就是你提到的全局变量
2.event事件
3.工作线程调用GetMessage创建消息循环,主线程postthreadmessage
4.工作线程封装成线程类,主线程去操作线程类对象
后者,不要在子线程里去操作不属于它的UI,android里也是这样的,MFC里具体原因可以去百度,打字太累了。发消息申请内存的话如果在同一个模块比如都在exe里是没问题的,但如果子线程在一个DLL里那就可能会有问题
句柄是参数,不同的句柄不同的处理对象,为什么要用全局的呢,全局的会破坏封装,MFC里没有传递句柄是因为被封装了,句柄作为窗口对象的成员,当然就没必要再传递了
感谢,针对第二点工作线程收到较多的数据共享给主线程,有什么通用的方法?
new+postmessage
timer