2017-04-23 22 views
-3

私は最近、cppを試しました。私は、20の値を持つ変数が1秒ごとに減算されるようにしようとしていますが、マシンがユーザからの入力。私はforループを使ってみましたが、入力が置かれるまで、または変数がなくなるまで進めません。私は時計を見ましたが、彼らは私の必要性に合っていないようです、あるいは、私はちょうど彼らの目的を誤解しました。C++はタイマーをバックグラウンドで実行していますか?

提案がありますか?

+0

「入力を待つ必要がある」ことを明確にしてください。これは変数countdownにどのように適合しますか? – bolov

+1

バックグラウンドで実行するには、一般にスレッドが必要です。私はC++よりもはるかにCの経験がありますが、C++でのスレッディングがシステムライブラリ(POSIX準拠のマシンでは 'pthread.h 'など)に依存している点でCに似ています。したがって、使用しているオペレーティングシステムは、ソリューションを策定する上で重要な要素になります。あなたが試したコードを含めてください。 StackOverflowは問題の解決を支援するためにここにありますが、コミュニティの私たちは、他の人のためのコードを書くだけではありません。 – SpencerD

+0

私はWindows Mediaタイマーがほしいと思っています。そのために、そして実際のタイマーでは、winapi環境で開発する必要があります。 (Windowsの場合)。 –

答えて

0

コメントの中ですでに示唆されているように、スレッド化はこれを行う1つの方法です。良い自己完結型の例here(私は下のコードから借りてきた)があります。

以下のコードでは、非同期関数が起動しています。これらの詳細はhereです。これは、ジョブが終了すると結果を含むfutureオブジェクトを返します。

この場合、ジョブはcin(通常は端末入力)をリッスンしていて、何らかのデータが入力されたとき(つまり入力が押されたとき)に戻ります。渡されたどのくらいの時間を追跡し、whileループが実行されますところで

は、カウンタをデクリメントし、また非同期ジョブが終了した場合に返されます。あなたの質問から、これがまさにあなたが望む行動かどうかは明らかではありませんでしたが、それはあなたにアイデアを与えます。減少した変数の値が表示されますが、ユーザーがテキストを入力すると、ユーザーがenterを押すとその値が表示されます。

#include <iostream> 
#include <thread> 
#include <future> 
#include <time.h> 

int main() { 
    // Enable standard literals as 2s and ""s. 
    using namespace std::literals; 

    // Execute lambda asyncronously (waiting for user input) 
    auto f = std::async(std::launch::async, [] { 
     auto s = ""s; 
     if (std::cin >> s) return s; 
    }); 

    // Continue execution in main thread, run countdown and timer: 
    int countdown = 20; 
    int countdownPrev = 0; 
    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); 
    std::chrono::steady_clock::time_point end; 

    double elapsed; 

    while((f.wait_for(5ms) != std::future_status::ready) && countdown >= 0) { 
     end = std::chrono::steady_clock::now(); 
     elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count(); 
     countdown = 20 - (int) (elapsed/1000); 

     if (countdown != countdownPrev) { 
      std::cout << "Counter now: " << std::fixed << countdown << std::endl; 
      countdownPrev = countdown; 
     } 
    } 
    if (countdown == -1) { 
     std::cout << "Countdown elapsed" << std::endl; 
     return -1; 
    } else { 
     std::cout << "Input was: " << f.get() << std::endl; 
     return 0; 
    } 
} 

P.S.これを私のコンパイラで動作させるには、スレッドライブラリを正しくリンクし、C++ 14の機能を使用できるようにするために、g++ -pthread -std=c++14 file_name.cppをコンパイルする必要があります。

関連する問題