• 6250阅读
  • 10回复

Qt线程池处理消息队列 [复制链接]

上一主题 下一主题
离线lwei24
 

只看楼主 倒序阅读 楼主  发表于: 2021-02-25
各位大佬,请问Qt怎么实现一个线程池处理多个消息队列?
离线fsx92

只看该作者 1楼 发表于: 2021-02-25
你可以把需求说的更明确一些,这里要考虑每一项任务的负载,尽量做到均衡。简单的话你可以设置一个监测的线程和若干工作线程,监测线程轮询多个消息队列,发现有消息后就从线程池中取出一个空闲线程去处理。
1条评分威望+1
lwei24 威望 +1 - 2021-03-08
离线liudianwu

只看该作者 2楼 发表于: 2021-02-25
放入队列挨个取出处理就行
1条评分威望+1
lwei24 威望 +1 - 2021-03-08
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线九重水

只看该作者 3楼 发表于: 2021-02-26
楼上2位已经大致说清楚了,我再打个比方。
假设有一个包工头(监测线程),他手底下有10个打工人(工作线程),假设名字分别为李世民1号,李世民2号……李世民10号。
当包工头接到一个活,说需要建国打天下,于是包工头叫李世民1号带兵出去打仗建国;
当包工头又接到一个活,说要治理天下,于是包工头叫李世民2号去御书房批奏折去了;
当包工头再接到一个活,要微服私巡,于是包工头叫李世民3号穿着乞丐的衣服去也……
1条评分威望+1
lwei24 威望 +1 - 2021-03-08
离线lwei24

只看该作者 4楼 发表于: 2021-02-26
回 fsx92 的帖子
fsx92:你可以把需求说的更明确一些,这里要考虑每一项任务的负载,尽量做到均衡。简单的话你可以设置一个监测的线程和若干工作线程,监测线程轮询多个消息队列,发现有消息后就从线程池中取出一个空闲线程去处理。 (2021-02-25 16:53) 

哦哦,多谢你的意见。其实,需求就是有一个消息队列,这个消息队列有两个小任务。我再使用线程处理消息队列的任务时,感觉线程池和线程好像没有关联起来。。。。
离线lwei24

只看该作者 5楼 发表于: 2021-02-26
回 liudianwu 的帖子
liudianwu:放入队列挨个取出处理就行 (2021-02-25 19:34) 

目前我是这样做的。还在考虑看有什么其他办法吗?想把线程池和消息队列一起使用上……
离线lwei24

只看该作者 6楼 发表于: 2021-02-26
回 九重水 的帖子
九重水:楼上2位已经大致说清楚了,我再打个比方。
假设有一个包工头(监测线程),他手底下有10个打工人(工作线程),假设名字分别为李世民1号,李世民2号……李世民10号。
当包工头接到一个活,说需要建国打天下,于是包工头叫李世民1号带兵出去打仗建国;
当包工头又接到一个活,说要 .. (2021-02-26 10:10) 

嗯额,多谢你的例子。方便问一下,如何更好的等待某个工作线程完成后,再执行下一个工作线程。比如,李世民1工作线程完成任务后,才能执行李世民2。有什么办法,让主线程不卡,但它们的第一工作线程按照顺序执行完再执行下一个工作线程呢?
离线donglaile

只看该作者 7楼 发表于: 2021-02-27
每个线程执行完毕后通知主线程,主线程再启动下一个线程
1条评分威望+1
lwei24 威望 +1 - 2021-03-08
离线fsu0413

只看该作者 8楼 发表于: 2021-02-27
我感觉这个就是多线程设计问题。。。
拿三楼的例子来说,就是包工头是主线程,所有的李世民在QThreadPool中,李世民是QRunnable。
默认情况下,李世民办完事就跑了,如果想让包工头知道李世民办完事,就需要李世民给包工头一个通知,可以让包工头提供一个signal给李世民,包工头自己接收signal,李世民办完事调用一下signal再跑,就可以知道李世民办完事了。

其实默认情况下QRunnable是用一个新建一个的。。。
1条评分威望+1
lwei24 威望 +1 - 2021-03-08
离线lwei24

只看该作者 9楼 发表于: 2021-03-01
回 donglaile 的帖子
donglaile:每个线程执行完毕后通知主线程,主线程再启动下一个线程 (2021-02-27 19:03) 

多谢您的意见,我也是这么考虑的。
离线lwei24

只看该作者 10楼 发表于: 2021-03-01
回 fsu0413 的帖子
fsu0413:我感觉这个就是多线程设计问题。。。
拿三楼的例子来说,就是包工头是主线程,所有的李世民在QThreadPool中,李世民是QRunnable。
默认情况下,李世民办完事就跑了,如果想让包工头知道李世民办完事,就需要李世民给包工头一个通知,可以让包工头提供一个signal给李世民,包工头自 .. (2021-02-27 20:07) 

多谢您的意见,这个正如你所想的,是多线程设计的问题。我也想设计一个比较符合实际问题的健全的线程机制,处理消息队列里的任务。
快速回复
限100 字节
 
上一个 下一个