У меня есть два потока, унаследованные от QThread. Сценарий - это объект потока2, излучающий сигнал, и объект thread1 имеет слот для выполнения. Я ожидал, что слоты выполняются в потоке2, но он выполняется в основном потоке !!!. Вот мой пример кода, чтобы показать, что:Политика выполнения слотов в многопоточных приложениях
Headrs.h
class Thread1 : public QThread{
Q_OBJECT
public:
Thread1(){}
protected:
void run(){
qDebug() << "run in thread " << this->currentThreadId();
exec();
}
private slots:
void slot1(){
qDebug() << "slot in " << this->currentThreadId();
}
signals:
void sig1();
};
class Thread2 : public QThread{
Q_OBJECT
protected:
void run(){
msleep(100);
qDebug() << "emit sig2 in: " << this->currentThreadId();
emit sig2();
}
signals:
void sig2();
};
class obj1 : public QObject {
Q_OBJECT
public:
obj1(){
connect(&t2, SIGNAL(sig2()), &t1, SLOT(slot1()));
connect(this, SIGNAL(sigObj()), &t1, SLOT(slot1()));
t1.start();
t2.start();
}
public:
void fcn(){
QThread::msleep(1000);
emit sigObj();
qDebug() << "emit sigObj in " << QThread::currentThreadId();
}
private:
Thread1 t1;
Thread2 t2;
signals:
void sigObj();
};
main.cpp
QCoreApplication a(argc, argv);
obj1 o1;
o1.fcn();
return a.exec();
Что я ожидаю от этого кода в Slot1() всегда выполняются в thread1 из оба излучаемых сигнала sig2() и sigObj(). Но независимо от того, в каком потоке мы испускаем сигнал, slot1 выполняется в основном потоке. Кстати, вот мой вывод:
run in thread 0x7ffff6169700 (thread1)
emit sig2 in: 0x7ffff5968700 (thread2)
slot in 0x7ffff7fce740 (main thread)
emit sigObj in 0x7ffff7fce740 (main thread)
slot in 0x7ffff7fce740 (main thread)
Это что-то не так или всегда так работает? И что мне делать, если я хочу выполнить слоты в своих потоках?
Пожалуйста, отметьте предложенный ответ, как принято (нажав на символ клещевого возле ответа), если он решает твоя проблема. – ixSci