- Если вы хотите знать, работает ли он в главном потоке, вам следует сравнить currentThread с потоком QCoreApplication:
if(QCoreApplication::instance()->thread() == QThread::currentThread()) {
qDebug() << "UI Thread in use";
} else {
qDebug() << "Worker thread in use";
}
QThread не является потоком, является обработчиком потока, как
документы указывает:
Подробное описание
A QThread
объект управляет одним потоком управления в программе. QПотоки начинают выполняться в run()
. По умолчанию run () запускает цикл обработки событий, вызывая exec () и запускает цикл обработки событий Qt внутри потока.
Кроме того, QThread является объектом QObject, который находится в потоке родителя или там, где онбыл создан, если у него нет родителя, как указано в документах :
Сходство потоков
Считается, что экземпляр QObject имеет сходство с потоком или что онживет в определенной теме. Когда QObject получает поставленный в очередь сигнал или опубликованное событие, слот или обработчик события запускается в потоке, в котором находится объект.
Примечание. Если QObject не имеет сродства к потоку (т. Е. Если поток () возвращает ноль), или если он находится в потоке, у которого нет работающего цикла обработки событий, он не сможет получать поставленные в очередь сигналы или опубликованные события.
По умолчанию QObject живет в потоке, в котором он создан. Сходство с потоком объекта можно запросить с помощью thread () и изменить с помощью moveToThread ().
Все объекты QObject должны находиться в том же потоке, что и их родительский объект. Следовательно:
- setParent () завершится ошибкой, если два задействованных объекта QObject живут в разных потоках.
- Когда объект QObject перемещается в другой поток, все его дочерние элементы также будут автоматически перемещаться.
- moveToThread () завершится ошибкой, если у QObject есть родительский элемент.
- Если QObject созданы в QThread :: run (), они не могут стать дочерними для объекта QThread, поскольку QThread не живетв потоке, который вызывает QThread :: run ().
Примечание: Переменные-члены QObject не становятся автоматически его дочерними. Родительско-дочерние отношения должны быть установлены либо путем передачи указателя на дочерний конструктор, либо путем вызова setParent (). Без этого шага переменные-члены объекта останутся в старом потоке при вызове moveToThread ().
В вашем случае объект «поток» - это объект QObject, который живет в основном потоке, поскольку у него нетродитель и там он был создан и обрабатывает другой поток.
Обновление:
MWE
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qsrand(0);
auto threadTest = std::function<void ()> ([&]() {
if(QCoreApplication::instance()->thread() == QThread::currentThread()) {
qDebug() << "UI Thread in use";
} else {
qDebug() << "Worker thread in use";
}
for (int var = 0; var < INT_MAX; ++var) {
int r = qrand() % 100;
QThread::msleep(r);
qDebug() << "[Worker Thread " << QThread::currentThreadId() << "] " << r;
}
});
QThread *thread = QThread::create(threadTest);
thread->start();
int var = 0;
std::function<void ()> timerTest;
timerTest = [&](){
int r = qrand() % 100;
qDebug() << "[UI Thread " << QThread::currentThreadId() << "] " << r;
++var;
if (var < INT_MAX)
QTimer::singleShot(r, timerTest);
};
int r = qrand() % 100;
QTimer::singleShot(r, timerTest);
return a.exec();
}
Вывод:
<b>Worker thread in use</b>
[UI Thread 0x7fc6222993c0 ] 94
[Worker Thread 0x7fc621f62700 ] 71
[UI Thread 0x7fc6222993c0 ] 86
[Worker Thread 0x7fc621f62700 ] 94
[UI Thread 0x7fc6222993c0 ] 37
[Worker Thread 0x7fc621f62700 ] 86
...