跨线程 信号的连接类型

来源:互联网 发布:qq群机器人软件 编辑:程序博客网 时间:2024/05/22 04:45

Qt 需要查看信号发出的线程是不是与接受者所在线程一致,来决定连接类型。注意,Qt 检查的是信号发出的线程(即,信号在哪个Thread中emit的,)


classThread:publicQThread
{
Q_OBJECT
signals:
    voidaSignal();
protected:
    voidrun(){
        emitaSignal();//在子线程中emit,发出信号
    }
};
 
/* ... */
Thread  thread;
Object obj;
QObject::connect(&thread,SIGNAL(aSignal()),&obj,SLOT(aSlot()));
thread.start();

aSignal()信号在一个新的线程被发出(就是Thread线程)。注意,因为这个线程Thread,并不是Object所在的线程(Object所在的线程是主线程),所以这里将会使用队列连接。




跨线程的信号槽也是类似的。当我们将信号与槽连接起来时,QObject::connect()的最后一个参数将指定连接类型:

  • Qt::DirectConnection:直接连接意味着槽函数将在信号发出的线程直接调用
  • Qt::QueuedConnection:队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数
  • Qt::BlockingQueuedConnection:阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回
  • Qt::AutoConnection:自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接

0 0
原创粉丝点击