我有一個類應該在一個線程中運行,並且需要一個用於插槽的事件循環,目前我用moveToThread()
很好地運行它,但我想使用QThreadPool
,並且遇到了問題。在QThreadPool中執行插槽
當QThreadPool
我可運行的run()
方法是從一個線程池(我檢查這與QThread::currentThread()
)呼籲運行,但我的插槽不彙集線程中運行的,所以我覺得對象沒有移動到池中的線程。
我認爲這是因爲我知道插槽在接收器的線程中運行,這正是我在使用moveToThread()
方法和QThread
時得到的(正確)行爲。
如何獲得我的QRunnable
(下面的示例中的Foo)完全在共用線程中運行? 或者是我做錯了什麼或理解錯誤?
以下POC演示了此問題:
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,標記爲答案,因爲我解決了問題,不完全如您所說,因爲我在worker中運行事件循環,而不是在runnable中運行。 – Paul