2013-05-05 38 views
1

我在這裏是一個循環,應該每500毫秒讀取一臺設備上的輸出。這部分工作正常。但是,當我嘗試引入cin.get來提取正在按下的關鍵字「n」來停止循環時,我只能得到與此時按鍵數量一樣多的輸出。如果我按下任意鍵(除了'n')幾次然後輸入,我會得到更多的輸出。我需要的是循環保持循環,沒有任何交互,直到我希望它停止。C++在任何時候按鍵按下

下面的代碼:

for(;;) 
{ 
    count1++; 
    Sleep(500); 
    analogInput = ReadAnalogChannel(1)/51.0; 
    cout << count1*0.5 << "  " << analogInput << endl; 
    outputFile << count1*0.5 << ", " << analogInput << endl; 
    if (cin.get() == 'n') //PROBLEM STARTS WITH THIS INTRODUCED 
     break; 
}; 

我的輸出如下(有2個按鍵才能到這個階段的程序),除非我按了幾個鍵,然後輸入:

0.5 0 // as expected 
1  2 // as expected 
should be more values until stopped 

我沒有特別的偏好,只要它工作,使用哪種類型的循環。

謝謝!

+2

看到你已經在使用'Sleep',最快的方法是用'if(GetAsyncKeyState(0x4E)&0x8000)'替換if(cin.get()=='n')''。 'cin.get()'被阻塞。但是,在那裏有500毫秒的延遲,並不是那部分循環的大部分會進行異步檢查。有更好的方法可以做到這一點,但如果你稍微保持一個鍵或運氣好的話,那將會奏效。 – chris 2013-05-05 03:53:49

+0

它工作正常,但我需要按住一下鍵,稍後可能會成爲問題。請您指出我正確的方向,以替代解決方案嗎? – 2013-05-05 04:25:36

+0

您可以在您自己的進程中附加一個鉤子來監視擊鍵,並在n命中時通知循環。或者,你*可以*在單獨的線程中獲得輸入,這似乎是新答案的路線。 – chris 2013-05-05 04:30:38

回答

5

cin.get()是一個同步調用,它暫停當前執行線程,直到它獲得輸入字符(您按下一個鍵)。

你需要在一個單獨的線程中運行你的循環,並輪詢在cin.get()返回後你在主線程中改變的原子布爾值。

它可能是這個樣子:

std::atomic_boolean stop = false; 

void loop() { 
    while(!stop) 
    { 
     // your loop body here 
    } 
} 

// ... 

int main() { 
    // ... 
    boost::thread t(loop); // Separate thread for loop. 
    t.start(); // This actually starts a thread. 

    // Wait for input character (this will suspend the main thread, but the loop 
    // thread will keep running). 
    cin.get(); 

    // Set the atomic boolean to true. The loop thread will exit from 
    // loop and terminate. 
    stop = true; 

    // ... other actions ... 

    return EXIT_SUCCESS; 
} 

注:上面的代碼只是給一個想法,它使用Boost庫和標準C++庫的最新版本。這些可能不適用於您。如果是這樣,請使用您環境中的替代品。

+1

使用C++ - 11,有'std :: thread'可用。這裏不需要使用Boost。 – Twonky 2017-03-17 21:42:21

1

如果(cin.get()== 'N')

,直到它從你收到此鍵通話將停止你的循環。在你看到的情況下停止你的循環。

cin.get()將坐在那裏,直到它從你身上獲得按鍵。

相關問題