我目前使用QThreadPool來運行一些計算,但是我發現如果我把所有東西都扔進QThreadPool中,它實際上表現不好,並且似乎造成了一些崩潰的問題。所以我的想法是一次只有幾個線程傳入QThreadPool。我想知道是否有人可以分享一些代碼或例子,說明如何使用QThreadPool處理一臺PC上的數千個計算。我寫的東西如下,但是我覺得這是在那一刻(A類是從QRunnable繼承)導致一些崩潰問題對我來說:用於大量計算同時運行的QThreadPool
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)。寫入輸出監聽器時這會成爲問題嗎?
使用線程時,您不能使用Qt :: DirectConnection。如果您在使用Qt :: QueuedConnection時遇到問題,請首先解決該問題。 – RobbieE
在添加更多內容之前,不需要等待線程完成。如果添加到QThreadPool的'QRunnable'對象的數量大於maxThreadCount,它們將保持在隊列中直到線程變爲可用。 – RobbieE
'A-> doSomeSetting()'裏面發生了什麼?如果這是你所有的計算髮生的地方,那麼這就是你的問題所在,你的主要處理應該在'A-> run()'中。 – RobbieE