天天看点

实现signal和slot机制(2)-跨线程投递

前言

在1中,我们实现了一个基础的signal+slot的模块件调用机制,不过那个direct调用,在这篇中,我们将支持夸线程调用,即在对象的线程上下文中,调用对象的函数。

对象线程绑定

在qt中,有一个很重要的概念,对象线程绑定,即在每个对象实例时候,其保存其线程上下文信息,其中就有一个事件循环,跨线程的信号就是将这个一个task丢到这个事件循环中,在对象绑定的线程中完成slot响应。

实现

对slot调用的打包-Task

我们需要将一个跨线程的slot调用打包成一个task,然后丢到想相应的事件循环中。在事件循环中需要维护一个task队列,那第一还是需要做容器。

struct TaskBase
{
    virtual ~TaskBase() = ;
    virtual void run() = ;
};

TaskBase::~TaskBase()
{
}
           

TaskBase

为我们Task基类,在事件循环中,维护其一个链表。

我们继承它,实现我们第一个Tas