QThreadPool可以同时运行大量计算

时间:2014-03-27 11:20:17

标签: c++ multithreading qt threadpool computation

我目前正在使用QThreadPool来运行一些计算,但是我发现如果我把所有东西扔进QThreadPool,它实际上表现不佳并且它似乎导致一些崩溃问题。所以我的想法是只有几个线程一次传入QThreadPool。我想知道是否有人可以分享一些代码或示例如何使用QThreadPool在一台PC上处理数千计算。我写了如下内容,但我觉得这对我造成了一些崩溃的问题(A类继承自QRunnable):

for(int i=0;i<1000;i++)
{
    Class* A = new Class();
    A->doSomeSetting(i);

    A->setAutoDelete(true);

    connect(A,SIGNAL(OutputProvider(int))
       ,this,SLOT(OutputListener(int)),Qt::DirectConnection);

    QThreadPool::globalInstance()->start(A);

    m_thread_count++;

    if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
    {
        QThreadPool::globalInstance()->waitForDone();
    }
}
QThreadPool::globalInstance()->waitForDone();

初始化设置:

m_maxThreadInPool = 4;
QThreadPool::globalInstance()->setMaxThreadCount(4);
m_thread_count = 0;
std::vector<int> output;

输出监听器:

void OutputListener(int output)
{
    output.push_back(output);
}

这是正确的做法还是有更好的方法?

同样在设置最大线程数时,您可以输入的最大数量是您可以拥有的核心数量吗?

我也在使用Qt :: DirectConnection(我使用QueueConnection时遇到了一些问题)。写入输出监听器时会出现问题吗?

2 个答案:

答案 0 :(得分:2)

Qt :: DirectConnection可能是个问题。如文档中所述,Queded连接需要与线程一起使用。请参阅QFConcurrent与QFuture和QFutureWatcher,此课程可以帮助您

答案 1 :(得分:1)

m_thread_count++;

if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
{
    QThreadPool::globalInstance()->waitForDone();
}

您正在等待所有的每4个任务完成:删除对waitForDone的所有调用,然后您将看到改进,QueuedConnection将再次运行

你可以添加比线程更多的任务,额外的任务将等到其他任务完成