У меня есть класс, который должен запускаться в потоке и нужен цикл событий для слотов, в настоящее время я хорошо его использую с moveToThread()
, но я бы хотел использовать QThreadPool
, и я столкнулся с проблемой.Выполнять слоты внутри QThreadPool
При запуске с QThreadPool
run()
метода моего работоспособного вызывается из объединенного потока (проверить это с QThread::currentThread()
), но мои слоты не работают в объединенном потоке, так что я думаю, что объект не перемещаются поток в пуле.
Я думаю, это потому, что я знаю, что слоты запускаются в потоке получателя, что является точно (правильным) поведением, которое я получаю при использовании метода и QThread
.
Как получить мой QRunnable
(Foo в примере ниже), который будет полностью запущен в пул потоков? Или это что-то я делаю неправильно или неправильно понял?
В следующем РОС демонстрирует проблему:
foo.h
#ifndef FOO_H
#define FOO_H
#include <QObject>
#include <QRunnable>
#include <QEventLoop>
class Foo : public QObject, public QRunnable
{
Q_OBJECT
public:
explicit Foo(int data, QObject *parent = 0);
void run();
signals:
void startWorking();
public slots:
void doWork();
private:
QEventLoop eventLoop;
int data;
};
#endif // FOO_H
foo.cpp
#include "foo.h"
#include <QThread>
#include <QDebug>
Foo::Foo(int d, QObject *parent) :
QObject(parent), eventLoop(this), data(d)
{
}
void Foo::run()
{
qDebug() << "run() in: " << QThread::currentThread();
connect(this, SIGNAL(startWorking()), this, SLOT(doWork()));
emit startWorking();
eventLoop.exec();
}
void Foo::doWork()
{
qDebug() << "doWork() in: " << QThread::currentThread();
}
main.cpp
#include <QCoreApplication>
#include <QThreadPool>
#include "foo.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Foo *foo = new Foo(42);
QThreadPool::globalInstance()->start(foo);
return a.exec();
}
Обратите внимание, однако, что в моем реальном коде сигнал не будет испускать сразу, потому что он будет после получения некоторых данных в сети.
PS: POC также можно найти here.
Интересно, я дам этот снимок. – Paul
+1, отмеченный как ответ, так как я решил проблему, не так, как вы сказали, потому что я запускаю цикл событий в рабочем, а не в runnable. – Paul