Ответ 1
Это не должно сильно отличаться от соединения с сигналом/слотом. Давайте взглянем на базовый механизм сигналов/слотов. В каждом потоке есть очередь событий, которая поддерживает сигналы (события), которые были выпущены, но еще не обработаны. Поэтому всякий раз, когда выполнение возвращается в цикл событий, очередь обрабатывается. Сам цикл событий не обрабатывает события. Скорее он доставляет их объектам, чтобы они могли справиться с этим. В этом специальном случае я предполагаю, что объект выдаст другой сигнал, который будет вставлен в очередь. Когда выполнение возвращается в цикл событий, новый сигнал обрабатывается объектом снова. Вот тест, который доказывает вышеприведенный аргумент.
Если вы запустили прилагаемые коды, выход будет выглядеть следующим образом:
before signal()
after signal()
slot() called
что означает определение типа соединения сигнального сигнала, поскольку очередь между потоками имеет ожидаемое поведение в очереди, которое отклоняет аргумент, который всегда является непосредственным. Если вы определяете его как прямой, выход будет выглядеть следующим образом:
before signal()
slot() called
after signal()
как ожидалось. он не генерирует никаких ошибок или предупреждений, и программа также не сбой. Убедитесь, что этот простой пример не работает и для большого и сложного.
main.cpp:
#include <QtGui/QApplication>
#include "dialog.h"
#include "testssconnection.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TestSignalSignalConnection * t = new TestSignalSignalConnection();
t->start();
return a.exec();
}
testssconnection.h:
#ifndef TESTSSCONNECTION_H
#define TESTSSCONNECTION_H
#include <QObject>
#include <QThread>
class TestSignalSignalConnection : public QThread
{
Q_OBJECT
public:
explicit TestSignalSignalConnection(QObject *parent = 0);
void run();
signals:
void signal1();
void signal2();
public slots:
void slot();
};
#endif // TESTSSCONNECTION_H
testssconnection.cpp:
#include "testssconnection.h"
#include <QtCore>
TestSignalSignalConnection::TestSignalSignalConnection(QObject *parent) :
QThread(parent)
{
}
void TestSignalSignalConnection::run()
{
TestSignalSignalConnection *t = new TestSignalSignalConnection();
this->connect(this,SIGNAL(signal1()),t,SIGNAL(signal2()), Qt::QueuedConnection);
t->connect(t,SIGNAL(signal2()), t,SLOT(slot()), Qt::DirectConnection);
qDebug() << "before signal()";
emit signal1();
qDebug() << "after signal()";
exec();
}
void TestSignalSignalConnection::slot()
{
qDebug() << "slot() called";
}