gpt4 book ai didi

c++ - 在 QThreadPool 中执行槽

转载 作者:太空狗 更新时间:2023-10-29 23:05:48 28 4
gpt4 key购买 nike

我有一个应该在线程中运行的类,并且需要一个事件循环用于插槽,目前我用 moveToThread() 运行它很好, 但我想使用 QThreadPool我遇到了一个问题。

当使用 QThreadPool 运行时run()我的 runnable 的方法是从池线程中调用的(我用 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 .

最佳答案

也许您可以将 class Foo 中的逻辑分成两部分:
主机 QRunnable 带有 QEventLoop 和工作程序 QObject,它是在 run() 的工作线程上创建的> 在调用 QEventLoop::exec 方法之前。然后将所有信号转发给工作对象。所以现在你的插槽将在池线程上调用。
但是,QThreadPool 是为执行大量短任务而设计的,而无需创建太多并发线程。一些任务已排队等待其他任务完成。如果这不是您的意图,您可能想回到良好的旧 QThread 并改用它。

关于c++ - 在 QThreadPool 中执行槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17875500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com