2014-03-27 41 views
0

我目前使用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)。寫入輸出監聽器時這會成爲問題嗎?

+0

使用線程時,您不能使用Qt :: DirectConnection。如果您在使用Qt :: QueuedConnection時遇到問題,請首先解決該問題。 – RobbieE

+0

在添加更多內容之前,不需要等待線程完成。如果添加到QThreadPool的'QRunnable'對象的數量大於maxThreadCount,它們將保持在隊列中直到線程變爲可用。 – RobbieE

+0

'A-> doSomeSetting()'裏面發生了什麼?如果這是你所有的計算髮生的地方,那麼這就是你的問題所在,你的主要處理應該在'A-> run()'中。 – RobbieE

回答

1

Qt :: DirectConnection可能是一個問題。如文檔中所述,Queded連接需要與線程一起使用。見QtConcurrent與QFuture和QFutureWatcher,這個類可以幫助你

1
m_thread_count++; 

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

你正在等待每4個任務他們的所有要做:刪除對waitForDone所有來電,然後你會看到改善和QueuedConnection會再次工作

您可以添加更多的任務之外還有線程額外的任務將等到別人的一個做

+0

因此可以創建數千個A類,並將它們一次性插入到線程池中?因爲每個計算都需要一些時間。 –

+0

@JohnYang是完全好,它會佔用一些內存,但可以管理 –

+0

我有問題時,我刪除了waitForDone()。程序在創建4個線程後崩潰,其中2個完成。我也更改爲QueueConnection,並沒有幫助。 –