2013-06-12 119 views
1

我有兩個傳感器,我需要不斷監視。兩個傳感器的內部工作是不同的,我需要不斷檢查兩個傳感器,如下所示。交錯執行兩個while循環

int sensorA(){ 
    while (true) { 
    // read sensor A 
    cout<<"sensorA \n"; 
    } 
} 
int sensorB(){ 
    while (true) { 
    // read sensor B 
    cout<<"sensorB \n"; 
    } 
} 

我的問題是如何確保兩個傳感器以交錯方式讀取?就像讀取sensorA然後SensorB然後是傳感器A等。

+3

'while(1){read(sensorA);讀(sensorB); '',嗯? – 2013-06-12 09:38:45

+0

@ H2CO3答案,我覺得 –

+0

@GrijeshChauhan做到了。 – 2013-06-12 09:43:33

回答

3

您需要在單獨的線程中運行它們。

線程1將運行一個循環,而線程2將運行另一個循環。

void thread1fun() 
{ 
    while (true) { 
    // read sensor A 
    cout<<"sensorA \n"; 
    } 
} 

void thread2fun() 
{ 
    while (true) { 
    // read sensor B 
    cout<<"sensorB \n"; 
    } 
} 

int main() 
{ 
    std::thread t1(thread1fun); 
    std::thread t2(thread2fun); 
    t1.join(); 
    t2.join(); 
} 

注意 正如在評論中指出,這隻能保證兩個while循環將連續運行。在「正常」體系結構中,線程的平均運行速度大致相同。但是,如果要求傳感器嚴格按如下所述讀取{s1,s2,s1,s2 ....},那麼這是不夠的。在這種情況下,您需要一個信號系統(事件和等待)來保證這個訂單。 如果您的傳感器可以快速讀取,那麼這可能是低效的。

+1

或者只是將put'em放入同一個循環中,而不是? – 2013-06-12 09:39:35

+2

線程不保證交錯。 –

+0

@ H2CO3 - 對不起,我以爲他出於某種原因不能這麼做。當然,如果他能那麼簡單得多! – Dennis

7

在同一個循環中讀取兩者?

int sensorA(); 
int sensorB(); 
while(true){ 
    //read A 
    count<<"sensor A \n"; 
    //read B 
    coutn<<"sensor B \n"; 
} 

如果你需要他們不斷讀不能,出於某種原因,得到延遲上的單個傳感器讀取之間,那麼你就需要爲每個傳感器的線程。

6

(EUH,所以作爲一個答案:)

我的意見剛剛看了他們一前一後,同樣的循環中。

while (1) { 
    read(sensorA); 
    read(sensorB); 
} 

類似上面的僞代碼會做的伎倆。

1

如果從傳感器讀取的是異步操作,您可能會對Boost.Coroutine的this example感興趣。