私は最近、cppを試しました。私は、20の値を持つ変数が1秒ごとに減算されるようにしようとしていますが、マシンがユーザからの入力。私はforループを使ってみましたが、入力が置かれるまで、または変数がなくなるまで進めません。私は時計を見ましたが、彼らは私の必要性に合っていないようです、あるいは、私はちょうど彼らの目的を誤解しました。C++はタイマーをバックグラウンドで実行していますか?
提案がありますか?
私は最近、cppを試しました。私は、20の値を持つ変数が1秒ごとに減算されるようにしようとしていますが、マシンがユーザからの入力。私はforループを使ってみましたが、入力が置かれるまで、または変数がなくなるまで進めません。私は時計を見ましたが、彼らは私の必要性に合っていないようです、あるいは、私はちょうど彼らの目的を誤解しました。C++はタイマーをバックグラウンドで実行していますか?
提案がありますか?
コメントの中ですでに示唆されているように、スレッド化はこれを行う1つの方法です。良い自己完結型の例here(私は下のコードから借りてきた)があります。
以下のコードでは、非同期関数が起動しています。これらの詳細はhereです。これは、ジョブが終了すると結果を含むfuture
オブジェクトを返します。
この場合、ジョブはcin
(通常は端末入力)をリッスンしていて、何らかのデータが入力されたとき(つまり入力が押されたとき)に戻ります。渡されたどのくらいの時間を追跡し、whileループが実行されますところで
#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
をコンパイルする必要があります。
「入力を待つ必要がある」ことを明確にしてください。これは変数countdownにどのように適合しますか? – bolov
バックグラウンドで実行するには、一般にスレッドが必要です。私はC++よりもはるかにCの経験がありますが、C++でのスレッディングがシステムライブラリ(POSIX準拠のマシンでは 'pthread.h 'など)に依存している点でCに似ています。したがって、使用しているオペレーティングシステムは、ソリューションを策定する上で重要な要素になります。あなたが試したコードを含めてください。 StackOverflowは問題の解決を支援するためにここにありますが、コミュニティの私たちは、他の人のためのコードを書くだけではありません。 – SpencerD
私はWindows Mediaタイマーがほしいと思っています。そのために、そして実際のタイマーでは、winapi環境で開発する必要があります。 (Windowsの場合)。 –