Qt 信号槽连接方式

Qt的使用这个函数处理信号

void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv)

 

多线程情况下:

直连或者队列连接使用  queued_activate()处理:

阻塞连接(BlockingQueuedConnection)相同线程直接调用,
不同线程使用 事件处理:

                QMetaCallEvent *ev = c->isSlotObject ?

 

                    new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :

 

                    new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);

 

                QCoreApplication::postEvent(receiver, ev);

 


if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread)

                || (c->connectionType == Qt::QueuedConnection)) {

 

                queued_activate(sender, signal_index, c, argv ? argv : empty_argv, locker);

 

                continue;

 

#if QT_CONFIG(thread)

 

            } else if (c->connectionType == Qt::BlockingQueuedConnection) {

 

                if (receiverInSameThread) {

 

                    qWarning("Qt: Dead lock detected while activating a BlockingQueuedConnection: "

 

                    "Sender is %s(%p), receiver is %s(%p)",

 

                    sender->metaObject()->className(), sender,

 

                    receiver->metaObject()->className(), receiver);

 

                }

 

                QSemaphore semaphore;

 

                QMetaCallEvent *ev = c->isSlotObject ?

 

                    new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :

 

                    new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);

 

                QCoreApplication::postEvent(receiver, ev);

 

                locker.unlock();

 

                semaphore.acquire();

 

                locker.relock();

 

                continue;

 

#endif

 

}
static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv,
                            QMutexLocker &locker)函数中:也是使用 事件进行处理:

QMetaCallEvent *ev = c->isSlotObject ?

        new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) :

 

        new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args);

 

    QCoreApplication::postEvent(c->receiver, ev);

 

 

 

posted @ 2024-05-13 19:37  愿得入睡  阅读(42)  评论(0)    收藏  举报