スレッドで実行する必要があり、スロットのイベント ループが必要なクラスがあります。現在は でうまく実行していますがmoveToThread()
、使用したいのですQThreadPool
が、問題が発生しました。
QThreadPool
私のランナブルのrun()
メソッドで実行すると、プールされたスレッドから呼び出されます(これを で確認しますQThread::currentThread()
)が、プールされたスレッドでスロットが実行されていないため、オブジェクトがプール内のスレッドに移動されていないと思います。
これは、スロットがレシーバーのスレッドで実行されていることを知っているためだと思います。これは、moveToThread()
メソッドとQThread
.
QRunnable
プールされたスレッドで完全に実行されるようにするにはどうすればよいですか? それとも、私が間違っているか、間違っていると理解していますか?
次の 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 はこちらからもご覧いただけます。