Qt多线程:如何将少量QRunnable任务附加到QThreadPool

时间:2013-11-24 20:14:28

标签: c++ multithreading qt threadpool

我对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 个答案:

答案 0 :(得分:4)

基本上它适用于你的例子(注意:我在堆上创建池本身,或者它将在函数范围的末尾删除)

pool = new QThreadPool(this);
pool->setMaxThreadCount (1);
pool->start(myQRunnablePtr1); 
pool->start(myQRunnablePtr2);
pool->start(myQRunnablePtr3);
// ...
pool->start(myQRunnablePtrN);

如果允许线程同时运行,则可以将maxThreadCount设置得更高。在这个例子中,它们将按照开始/排队的顺序执行,第一个必须在第二个运行之前结束。

另外,您可以为启动功能添加优先级,以后要更改排队。让我们说如果你有一个必须立即启动的任务。

Class也有一些其他的用例(比如tryStart),但在大多数情况下都可以使用。

答案 1 :(得分: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 );