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

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

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

  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处理服务提供触发式队列请求的服务

注意: 使用moveToThread的元素, 不能设置父图元—不与主线程元素关联,(因为在该元素创建所在的context里,都属于主线程的范畴, 包括thread元素创建时也在主线程中,一旦设置为父元素, 该元素的归属线程在底层可能就改不掉了)(moveToThread相当于把元素放在thread::run中创建—在线程的运行环境创建.); 这样move到QThread后, 该元素的slot服务响应就可以在线程中响应处理.(参考: https://baijiahao.baidu.com/s?id=1615219045511741840&wfr=spider&for=pc)

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

你可能感兴趣的:(设计)