【问题标题】:Qt multithreading: How to append few QRunnable tasks to QThreadPoolQt 多线程:如何将几个 QRunnable 任务附加到 QThreadPool
【发布时间】:2013-12-09 10:23:41
【问题描述】:

我对@9​​87654321@ 的工作原理感到困惑,找不到答案。我想要这样的东西:

class Task : public QRunnable { solve problem #nb }

现在,例如,我需要执行 10 个不相关且不共享某些值的任务。我希望我能做这样的事情:

QThreadPool pool;
pool.addTask(task1);
pool.addTask(task2);
pool.addTask(taskN);
pool.start();

对我来说,上面的例子是一个游泳池。我的任务很少,我添加到池中,最后在每个线程中全部执行,但这不是QThreadPools 的工作方式。那么,我可以使用QThreadPool 解决我的问题,还是应该使用其他东西?

谢谢。

【问题讨论】:

    标签: c++ multithreading qt threadpool


    【解决方案1】:

    基本上它适用于您的示例(注意:我在堆上创建池本身,否则它将在函数范围的末尾被删除)

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

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

    另外,您可以为启动功能添加优先级,以便稍后更改排队。假设您有一项必须立即开始的任务。

    该类也有一些其他用例(如 tryStart),但对于大多数情况来说,这里可能已经足够了。

    【讨论】:

    • 感谢您的回答,但是如果我应该等待第一个线程完成以启动第二个线程,为什么我仍然会使用线程。或者,你可能想说,如果 put setMaxThreadCount(3) 将执行前三个可运行对象,完成后将执行后三个?
    • 是的,使用 QThreadPool 的方法不止一种。如果您想让一个 Runnable 在另一个之后执行,请将 maxThreadCount 设置为 1。如果可以一次运行多个,则将其设置得更高。但它不会等待前三个在您的示例中完成。一旦其中一个完成,队列中的下一个将启动,总是有 3 个同时运行,直到队列为空。
    • 太棒了。这就是我需要的。我会尝试这种方法。谢谢
    【解决方案2】:
    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 个任务?
    • 既然要手动执行每个线程,为什么还需要一个池?
    • 嗯。不,我真的不想自己处理线程。我只想拥有类似队列的东西来处理线程。如果队列有 100 个任务,而我在 PC 上有 8 个线程,我想用 8 x 8 个任务来处理它。第二个答案表明QThreadPool 可以做到这一点。谢谢!
    猜你喜欢
    • 2020-08-18
    • 2013-12-28
    • 1970-01-01
    • 2015-09-21
    • 2014-03-25
    • 2012-01-07
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多