2011-11-11 48 views
11

處理流水線會有什麼解決的Qt以下問題的好辦法:多線程數據的Qt

我有一個傳感器類,它不斷地產生數據。在這些數據上,幾個操作必須在另一個之後執行,這可能需要很長時間。爲此我有一些額外的類。基本上,每次記錄一個新的數據項時,第一個類應該獲取數據,處理數據,並將其傳遞給下一個數據項等等。

傳感器 - > 1級 - > - >最後一堂課

我希望把管道的個別類到自己的線程,使1級可能已經在樣本N功1當類2被處理樣本n ...

另外,作爲各個步驟可以在它們的性能有很大的不同(例如,所述傳感器是比其他方式更快),我不感興趣的過時的數據,我想要1級(以及其後的所有內容)始終從其前任獲取最新數據,丟棄舊數據。所以,在管道的步驟之間沒有很大的緩衝區。

首先我想過使用Qt :: QueuedConnections作爲信號/插槽,但我想這會引入一個充滿過期樣本的隊列,等待流水線的較慢部分處理?

回答

3

你所面對的是一個生產者消費者模式。你可以在這裏找到一個大概的概述。 http://en.wikipedia.org/wiki/Producer-consumer_problem

你想用一個QMutex在一次對數據的訪問限制在一個線程。使用QMutexLocker來鎖定它。

對於一個非常簡化的例子:

QList<quint32> data; 
QMutex mutex; 

// Consumer Thread calls this 
int GetData() 
{ 
    quint32 result(-1); // if =1 is a valid value, you may have to return a bool and 
         // get the value through a reference to an int 
         // in the parameter list. 

    QMutexLocker lock(&mutex); 

    if (data.size()) 
    { 
     result = data.front(); // or back 
     data.clear(); 
    } 

    return result; 
} 

// Producer Thread calls this 
void SetData(quint32 value) 
{ 
    QMutexLocker lock(&mutex); 

    data.push_back(value); 
} 
5

只需建立自己的一個元素的「隊列」級。它應該有:

A piece of data (or pointer to data) 
A Boolean "dataReady" 
A mutex 
A condition variable 

的 「排隊」 功能就是:

lock mutex 
Replace data with new data 
dataReady = true 
signal condition variable 

的 「出列」 功能就是:

lock mutex 
while (!dataReady) cond_wait(condition, mutex) 
tmpData = data 
data = NULL (or zero) 
dataReady = false 
unlock mutext 
return tmpData 

類型的數據可以是一個模板參數。