【发布时间】:2013-07-26 09:04:18
【问题描述】:
我有一个应该在线程中运行的类,并且需要一个用于插槽的事件循环,目前我使用moveToThread() 很好地运行它,但我想使用QThreadPool,但我遇到了一个问题。
当使用QThreadPool 运行时,我的runnable 的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找到。
【问题讨论】:
标签: c++ multithreading qt threadpool qeventloop