2

ここにあるのは、機器の出力を 500 ミリ秒ごとに読み取るループです。この部分は正常に動作します。しかし、ループを停止するために押されたキー「n」を拾うために cin.get を導入しようとすると、ここまでのキーを押した回数だけしか出力されません。任意のキー (「n」以外) を数回押してから Enter キーを押すと、さらにいくつかの出力が得られます。私が必要とするのは、ループを停止するまで、対話なしでループし続けることです。

コードは次のとおりです。

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

機能する限り、どのタイプのループを使用するかについて特に好みはありません。

ありがとう!

4

2 に答える 2

9

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++ ライブラリを使用しています。それらは利用できない場合があります。その場合は、環境の代替手段を使用してください。

于 2013-05-05T04:29:39.047 に答える
1

もし (cin.get() == 'n')

この呼び出しは、あなたからキーを受け取るまでループを停止します。あなたが起こっているようにあなたのループを止めることによってそこに。

cin.get() は、キーストロークを取得するまでそこに留まります。

于 2013-05-05T03:54:21.347 に答える