Слот, вызываемый сигналом, будет запущен в потоке, для которого связан QObject
.Слот, вызываемый напрямую, будет запущен в текущем потоке.Вот тестовая программа, которая демонстрирует.
Вывод:
main() thread: QThread(0x804d470)
run() thread: Thread(0xbff7ed94)
onRunning() direct call; thread: Thread(0xbff7ed94)
onRunning() signaled; thread: QThread(0x804d470)
Тестовая программа:
#include <QtCore>
class Thread : public QThread
{
Q_OBJECT
public:
void run()
{
qDebug() << "run() thread:" << QThread::currentThread();
emit running();
}
public slots:
void onRunning()
{
qDebug() << "onRunning() thread:" << QThread::currentThread();
}
signals:
void running();
};
#include "threadTest.moc"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug() << "main() thread:" << QThread::currentThread();
Thread t;
QObject::connect(&t, SIGNAL(running()), &t, SLOT(onRunning()));
t.start();
QTimer::singleShot(100, &app, SLOT(quit()));
return app.exec();
}