ホームページ >バックエンド開発 >C++ >同時実行性を使用して C でノンブロッキング コンソール入力を実装するにはどうすればよいですか?

同時実行性を使用して C でノンブロッキング コンソール入力を実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 17:04:02546ブラウズ

How to Implement Non-Blocking Console Input in C   Using Concurrency?

C でのノンブロッキング コンソール入力

プログラミングにおける一般的な要件は、プログラムが継続的に実行され情報を出力している間にユーザー コマンドを処理することです。 C の従来のコンソール入力メソッドは、ユーザーが Enter キーを押すまでプログラムの実行をブロックしますが、ブロックしない入力の場合は、別のアプローチが必要です。

解決策: 同時実行

C 11 では、同時実行のための std::async および std::future ライブラリが導入されています。これにより、メイン プログラムを停止することなく、ノンブロッキング入力用の別のスレッドを生成できます。

実装

提供されたコードは、ノンブロッキング コンソール入力を示しています。

<code class="cpp">#include <iostream>
#include <future>
#include <thread>
#include <chrono>

std::string getAnswer()
{
    std::string answer;
    std::cin >> answer;
    return answer;
}

int main()
{
    std::chrono::seconds timeout(5);
    std::cout << "Do you even lift?" << std::endl << std::flush;
    std::string answer = "maybe"; //default to maybe
    std::future<std::string> future = std::async(getAnswer);
    if (future.wait_for(timeout) == std::future_status::ready)
        answer = future.get();

    std::cout << "the answer was: " << answer << std::endl;
    exit(0);
}</code>

このコード内:

  • getAnswer() は別のスレッドでユーザー入力を読み取る関数です。
  • std::async 関数は getAnswer(
  • future.wait_for() 関数は、getAnswer() が指定された時間枠 (この場合は 5 秒) 内に終了したかどうかを確認します。
  • If getAnswer()が終了すると、その結果は応答変数に保存されます。
  • ユーザー入力スレッドがバックグラウンドで動作している間、プログラムは実行を続けて情報を出力します。

以上が同時実行性を使用して C でノンブロッキング コンソール入力を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。