能不能使得Tabcontrol的每一页都对应一个单独的UI线程

chenliang_kk 2009-10-08 12:43:07
我想做一个简单的监控软件,希望在Tabcontrol的每一页上都能够显示一个独立现场设备(下位机)的测量数据。

看到tabcontrol的样子很适合,于是就用了。

可是后来发现涉及到界面的显示都是在主线程里处理(其实就是多个Socket接收线程均将消息抛到主线程,主线程处理显示到界面上),一旦现场的监控点多了,主线程的负荷就会很大,担心会出问题,而且现在效果也不太好。

所以就想 :能不能Tabcontrol的每一个页面都是对应一个独立的UI线程,而不是都是由主线程创建呢?这样的话就可以通过各自的UI线程显示了,和主线程没关系了。。。我这么想。。。

如何能实现,怎么做呢,或者大家还有什么别的意见和建议,说出来吧,谢过。另外,我是用VC++做的监控界面。。。
...全文
102 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jourbin 2009-10-08
  • 打赏
  • 举报
回复
首先UI线程跟工作者线程其实没啥区别,你只要在线程里调用GetMessage,系统就会为该线程创建消息泵了

你把每个Tab下的窗口的hwnd对应到每个线程就行了,线程里有界面显示的要求,都通过SendMessage,PostMessage给该hwnd就行

我觉得你现在的做法也差不多,只是多了一步查找tab下窗口句柄的步骤.

在某一时刻,一个tabcontrol只能显示某个tab下的窗口,其他窗口只要保存显示信息就行(切换到所在tab时,再显示).
个人觉得你现在的做法,性能也应该能够满足

建议检查一下是不是还有许多优化可以做
chenliang_kk 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jourbin 的回复:]
汗~~~~~~
2个socket监听同一个端口,这样又不会快一些

只听说过一个监听,收到数据后扔给不同的线程
没有听说过2个socket,去监听同一个端口
[/Quote]

看来只能改程序了。。。。。
jourbin 2009-10-08
  • 打赏
  • 举报
回复
汗~~~~~~
2个socket监听同一个端口,这样又不会快一些

只听说过一个监听,收到数据后扔给不同的线程
没有听说过2个socket,去监听同一个端口
chenliang_kk 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jourbin 的回复:]
首先UI线程跟工作者线程其实没啥区别,你只要在线程里调用GetMessage,系统就会为该线程创建消息泵了

你把每个Tab下的窗口的hwnd对应到每个线程就行了,线程里有界面显示的要求,都通过SendMessage,PostMessage给该hwnd就行

我觉得你现在的做法也差不多,只是多了一步查找tab下窗口句柄的步骤.

在某一时刻,一个tabcontrol只能显示某个tab下的窗口,其他窗口只要保存显示信息就行(切换到所在tab时,再显示).
个人觉得你现在的做法,性能也应该能够满足

建议检查一下是不是还有许多优化可以做
[/Quote]

还有一个问题想问问,是刚出现的问题。。。

我在上位机监控程序中用2个数据报Socket接收线程同时监听同一UDP端口,就是用两个Socket监听同一ip下

的同一端口,虽然每个线程中都指定了对应tab页的m_hwnd,但是在抛出消息给主线程的时候,信息总是在一

个tab页上显示,并且是在该tab页上重叠显示不同现场监控设备的信息,没有实现在多个tab页上的对应显示

这又是为何呢?难道不能用两个线程同时监听同一ip下的同一端口么?。。。困惑中。。
chenliang_kk 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jourbin 的回复:]
首先UI线程跟工作者线程其实没啥区别,你只要在线程里调用GetMessage,系统就会为该线程创建消息泵了

你把每个Tab下的窗口的hwnd对应到每个线程就行了,线程里有界面显示的要求,都通过SendMessage,PostMessage给该hwnd就行

我觉得你现在的做法也差不多,只是多了一步查找tab下窗口句柄的步骤.

在某一时刻,一个tabcontrol只能显示某个tab下的窗口,其他窗口只要保存显示信息就行(切换到所在tab时,再显示).
个人觉得你现在的做法,性能也应该能够满足

建议检查一下是不是还有许多优化可以做
[/Quote]

十分感谢
chenliang_kk 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 superdiablo 的回复:]
开多个线程在你CPU只有一个的情况下只会增加负担,而不会如你所愿。何况开多个UI线程不是一个好主意。
如果实在觉得负荷太大,可以一方面用多个工作者线程负责采集并把结果发给主线程,另一方面要增加CPU的数量。

[/Quote]

十分感谢。
superdiablo 2009-10-08
  • 打赏
  • 举报
回复
开多个线程在你CPU只有一个的情况下只会增加负担,而不会如你所愿。何况开多个UI线程不是一个好主意。
如果实在觉得负荷太大,可以一方面用多个工作者线程负责采集并把结果发给主线程,另一方面要增加CPU的数量。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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