qt多线程简单触发式消息响应服务

来源:互联网 发布:我们走了一些弯路 知乎 编辑:程序博客网 时间:2024/06/02 02:32

使用的场景:
例如 大型超市的收银-多个收银柜台应对客户的买单需求

  1. 每个收银柜台相当于一个线程
  2. 收银柜台提供收银的服务,每次服务都是对客户买单事件的响应

反向设计来看:
// 收银服务: 提供对客户收银等服务
class BillService
{
event(QEvent e);
};
// 收银柜台:提供独立的收银线程环境,并一直等待客户
class BillThread
{
run();
}

  1. 收银服务对于客户来说,是互相独立,需要能并行的做;
    一个收银柜台提供一个单通道的收银服务;
    这样的话,收银柜台就需要有多个,才能并行的收银。
  2. 我们希望收银台一直开着,来了客户就能收银,不用一会开一会关。
  3. 我们希望一个柜台前可以排一个客户队伍,一个个先来先服务

这样就需要:

  1. 收银台线程一直是在等待服务状态
    QThread线程的run处理中:放入QEventLoop,确保线程一直在提供服务。
  2. 收银服务提供排队服务的消息响应机制—QEvent机制
  3. 一个收银服务位于一个收银台线程中
  4. 每当客户排队来收银,排那个收银台,就给哪个收银服务发送QEvent买单请求,收银服务挨个处理即可

如果你有这个问题:为什么线程不能自己来响应线程内的Event呢?
对于Qt的线程来说,只有run里面的是多线程运行的,线程本身Object是属于父线程的,所以线程Object不能响应子线程里的Event;只有在run里面创建的Object/或moveToThread过来的Object,才算是线程上的Object,可以响应线程上的Event。

总体看这种设计

  1. 线程提供持续服务的独立运行环境;多个线程提供并发的该环境;
  2. 绑定线程的QEvent处理服务提供触发式队列请求的服务

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

原创粉丝点击