如何实现多个线程同时更新一个UI呢

clever101
博客专家认证
2017-12-11 06:49:49
在许多行业应用中,客户端-服务架构不可替代。在客户端-服务架构下,服务扮演着重要的角色。现在用qt编写一个服务端和客户端程序(都是桌面UI程序),大致的架构是在一个局域网环境内有一个服务端和多个客户端,多个客户端访问一个服务端,客户端一连接服务端,服务端这边的界面就立即把客户端的ip信息添加到客户端列表中。现在设想这样一个情景:多个客户端几乎同时上线,服务端这边使用多线程socket来应对多个客户端连接,那么如何几乎更新客户端列表这个控件呢?我想这里估计得涉及到互斥。

我搜索了网上的一个qt的多线程更新界面的例子,基本上都是自定义一个工作线程,然后在工作线程里使用自定义的信号和槽来进行更新,这里只是解决单个线程更新单个UI的问题。如何实现多个线程同时更新一个UI呢?
...全文
512 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大风哉 2017-12-15
  • 打赏
  • 举报
回复
我觉得2楼的方案可行。 我觉得有两个方法,第1个方法:就像2楼说的,服务器就设置一个slot,让多个signal来触发,触发一个就更新一个。这个是服务器作为被动角色; 第2个方法:客户端连接上服务器后就把信息更新到一个全局或者共享的地址中,服务器定时轮询插到消息后更新到界面上。 这两个方法因为都涉及到内容共享,所以要用到互斥。
决战小树林 2017-12-15
  • 打赏
  • 举报
回复
一个线程和多个线程不是一样的做法吗啊?将socket线程发送的信号绑定到同一个槽函数里实现刷新UI界面就可以,信号带上参数就可以区分是那个socket客户端了!!
走好每一步 2017-12-15
  • 打赏
  • 举报
回复
玩互斥很危险的同学, Thread1 { emit UpdateSignal; (MainWindow->UpdateData) } UpdateData { Mutex.lock 跑到这里刚好线程切出去了,那么其它线程都会被阻塞在这里呢,但是在这时间段里,你的线程怎能为你客户端服务呢? Mutex.unlock } 上线就上线,一个一个来,又急不来。
走好每一步 2017-12-15
  • 打赏
  • 举报
回复
互斥个屁,同一个帖子发两遍! 先弄懂什么叫消息队列再说,你如果没有win32的基础,互斥个锤子。 1)没有MoveThread, emit UpdateSignal(Data),相当于直接调用MainWindow的槽函数,所以这里要互斥! 2)MoveThread后,emit UpdateSignal(Data),相当于在MainWindow的信号队列里压入,然后MainWindows慢慢一个一个地执行,那还存在什么互斥? WorkThread { WorkThread() { MoveThread(this) } Run { IsRcvDataOk() { emit UpdateSignal(Data); } } } MainWindow { Connect(&workThread, UpdateSignal, this, UpdateData); }
feiyangqingyun 2017-12-15
  • 打赏
  • 举报
回复
多个线程发信号出来,将信号都绑定到易格草函数中,槽函数更新UI。
大风哉 2017-12-13
  • 打赏
  • 举报
回复
帮顶! 这类问题我也在学,楼主解决的时候总结个思路啊

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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