Qt多线程:如何将几个QRunnable任务添加到QThreadPool?

3

我对于QThreadPool的工作原理感到困惑,但无法找到答案。我希望能有一个像这样的东西:

class Task : public QRunnable { solve problem #nb }

现在,例如,我需要完成10个无关且没有共同值的任务。 我希望我能做一些类似于这样的事情:
QThreadPool pool;
pool.addTask(task1);
pool.addTask(task2);
pool.addTask(taskN);
pool.start();

对我来说,上面的例子就像是一个池子。我有几个任务,将它们添加到池中,最终在每个线程中执行所有任务,但这不是 QThreadPools 的工作方式。那么,我能否使用 QThreadPool 解决我的问题,还是应该使用其他东西?

谢谢。

2个回答

6
基本上,它对于您的示例的工作方式如下(注:我将池本身创建在堆上,否则它将在函数范围结束时被删除)。
pool = new QThreadPool(this);
pool->setMaxThreadCount (1);
pool->start(myQRunnablePtr1); 
pool->start(myQRunnablePtr2);
pool->start(myQRunnablePtr3);
// ...
pool->start(myQRunnablePtrN);

如果允许线程同时运行,您可以将maxThreadCount设置得更高。在此示例中,它们将按照启动/排队顺序执行,并且第一个必须在第二个运行之前结束。

此外,如果您想稍后更改排队方式,可以向start函数添加优先级。比如说,如果您有一个需要立即启动的任务。

该类还有其他用途(例如tryStart),但对于大多数情况而言,这应该足够了。


谢谢您的回答,但是如果我必须等待第一个线程完成才能启动第二个线程,那么为什么我要使用线程呢?或者,您可能想说如果设置setMaxThreadCount(3),那么它将执行前三个可运行项,然后在完成后执行另外三个? - chao
是的,有不止一种使用QThreadPool的方法。如果您希望一个Runnable在另一个之后执行,请将maxThreadCount设置为1。如果可以同时运行多个,则将其设置更高。但是在您的示例中,它不会等待前三个全部完成。一旦其中一个完成,队列中的下一个将被启动,始终保持3个同时运行,直到队列为空。 - Marcel Blanck
太好了。这正是我需要的。我会尝试这种方法。谢谢。 - chao

1
class MyRunnable : public QObject, public QRunnable
{
    Q_OBJECT

public:

    explicit MyRunnable( int socket);
    virtual ~MyRunnable();
    virtual void run();

private:
    int socket_;
};

QThreadPool pool;
pool.setMaxThreadCount( 50 );
pool.start( new MyRunnable( socket), -1 );

谢谢。我在文档中找到了类似的内容,但是我想知道是否可以这样处理:QVector<MyRunnable*> runnables,然后像这样执行 for(run : runnables) pool->start(run); ,并期望它将在5个线程中先执行前5个任务? - chao
为什么需要使用线程池,既然您想要手动执行每个线程? - 4pie0
嗯,不,我真的不想自己处理线程。我只想有像队列一样的东西来处理线程。如果队列有100个任务,而我的PC上有8个线程,我想每次处理8个任务。第二个答案说这可以通过QThreadPool实现。谢谢! - chao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接