我对QThreadPool
如何运作感到困惑,无法找到答案。我想有这样的事情:
class Task : public QRunnable { solve problem #nb }
现在,例如,我需要完成10个不相关的任务,并且它们不共享某些值。我希望我能做到这样的事情:
QThreadPool pool;
pool.addTask(task1);
pool.addTask(task2);
pool.addTask(taskN);
pool.start();
对我来说,上面的例子是一个游泳池。我有几个任务,我添加到池中,最后在每个线程中执行它,但这不是QThreadPools
的工作方式。那么,我可以使用QThreadPool
解决我的问题,还是应该使用别的东西?
谢谢。
答案 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 );