2016-04-27 15 views
1

私はより大きなプロジェクトのための概念証明を作成しようとしています。私は現在、タイムクイズに取り組んでいます。質問は1つしかありません。答えは10秒です。他のコマンドが実行されている間にタイマーを実行するC++

本当に私は "< <ヴァールはcin"

を行うことによって、ユーザーの入力を読み取ることができます知っている

  • を求めて何イムまたは "ヴァール= _getch()"

  • 私はタイマーを作ることでできます。

    clock_t timer;

    timer = clock();

    //コード

    タイマー=クロック() - トン。

  • しかし、どのようにまとめていますか?それは入力を求めている間にタイマーを実行することができますか? C++は各パーツを実行する行ごとに進み、移動する前に完了するまで待っているので、そうは思われません。しかし、方法がある必要があります!ここで私は

    間隔については申し訳ありません
    bool Question(int Correct) { 
        int Answer = 0; 
        cin >> Answer; 
        if (Answer == Correct) { 
         return true; 
        } 
        else { 
         return false; 
        } 
    } 
    
    int main() { 
    
    cout << "1 + 1 is: "; 
    
    clock_t Timer; 
    Timer = clock(); 
    
    bool Is_Correct = Question(2); 
    
    Timer = clock() - Timer; 
    
    cout << "You Answered: "; 
    
    if (Is_Correct) { 
        cout << "Correct!"; 
    } 
    else { 
        cout << "Wrong!"; 
    } 
    
    cout << "\nAnd by the way, you answered the question with " << 10 - (Timer/CLOCKS_PER_SEC) << " Seconds to Spare.\n"; 
    
    cin.get(); 
    cin.get(); 
    
    return 0; 
    } 
    

...を思い付いている、それはちょっと台無しに得たものです。

+0

、これは非常にCに似ています!時刻のようなユーティリティには ''ヘッダを使ってみてください。 – DeiDei

+0

@alf申し訳ありませんが、私はそれが窓だけになると言いました。命令(cin)が10秒以内に答えられなければ、それはちょうど "動く"べきであるとexeに伝える方法はありますか? – Dosisod

+0

なぜより適切な操作をしようとしているのなら、それを正しく実行しないで、コードプロファイリングツールを視覚化して使用してみましょう。 HPCコミュニティでは、チューニングと分析ユーティリティ(TAU)http://www.cs.uoregon.edu/research/tau/home.phpが人気があります。それは完全な吹き飛ばされた計器のように見えて、プロファイリングが過度である、1)それはあなたにあなたが望むタイミング情報とより詳細なタイミングを与えるでしょう、2)この種のツールを使用する方法を知っていることは良いです、3)あなたが探していたものですが、プロセスのパフォーマンスのボトルネックに関して面白いものが見つかるかもしれません。 – Matt

答えて

0

プログラムが入力を待っている間にクロックが動作し続けているため、入力操作のタイミングを取ることに時間がかかっていません。しかし、10秒が経過したときに入力操作を中止したい場合は、キーボードのポーリングなどのプラットフォーム固有の手段を使用する必要があります。すべての標準C++入力操作がブロックされています。ですから、標準のC++だけでは、入力操作を独自の実行スレッドに入れようとすることができます。非同期であると推論します。それはスレッドのためのものです。しかし、それは入力を待っている間にそのスレッドを終了する方法がないこと、そして(創造的な)擬似入力をそれに投稿する方法がないことを発見するでしょう。それは入力を求めている間

に関するそれでも

は、あなたはタイマーを実行していることができますか?

実行中の時間を表示することを意味する場合は、どうして問題ありません。

あなたはそれを自分のスレッドに入れることができます。

ただし、1行に複数の文字を入力する必要がある場合は、システム固有の手段を使用する必要があります。標準ライブラリのテキスト表示の変更機能(ASCII \b\rコントロール)私が表示される時刻が変更されるたびに、以下に例示するように台無しのテキストカーソルの位置を考えることができ、それを行うにはどのような方法:スタートとして

#include <atomic> 
#include <chrono> 
#include <exception> // std::terminate 
#include <iostream> 
#include <iomanip>  // std::setw 
#include <thread> 
using namespace std; 

auto fail(string const& s) 
    -> bool 
{ cerr << "!" << s << "\n"; terminate(); } 

auto int_from(istream& stream) 
    -> int 
{ 
    int x; 
    stream >> x || fail("Input operation failed"); 
    return x; 
} 

namespace g { 
    atomic<bool> input_completed; 
} // namespace g 

void count_presentation(string const& prompt) 
{ 
    for(int n = 1; not g::input_completed; ++n) 
    { 
     string const count_display = to_string(n); 
     string const s = count_display + prompt.substr(count_display.length()); 
     cout << "\r" << s << flush; 

     using namespace std::chrono_literals; 
     this_thread::sleep_for(100ms); 
    } 
} 

auto main() 
    -> int 
{ 
    string const prompt = string(20, ' ') + "What's 6*7? "; 
    auto counter = thread(count_presentation, ref(prompt)); 
    const int x = int_from(cin); 
    g::input_completed = true; 
    counter.join(); 
    cout << x << "\n"; 
} 
+0

Windowsではそうですか? C++ 11 – Dosisod

+0

@Dosisod:もし意味があるのなら、Windowsにはどんなシステム固有の手段があるのですか?それで、Windowsは使いにくく、正しくコンソールウィンドウAPIを持っています。しかし、Windowsでもncursesライブラリを使うことができます。あなたのコンパイラがそれをサポートしていれば、キーボードポーリングをサポートする 'conio.h'という非標準ヘッダがあります。 GUIの場合、Windowsはタイマーメッセージとハードスレッドタイマーの両方を提供します。 –

+0

ありがとうございました!私は、キーボード入力を待つことができ、まだタイマーを実行するスレッドを見つけました:http://stackoverflow.com/questions/14192230/wait-for-input-for-a-certain-time – Dosisod

0

これが見つかりましたClock In C++ Console?。それはクールで、あなたの質問に答えます。作者はgotoxy()を使用してコンソール出力の先頭に移動し、現在の時刻を上書きします。しかし、私はusing namespace std;のルーチンを推奨しないので、コードを編集しました。これとあなたのものを統合することで幸運

#include <iostream> 
#include <ctime> 
#include <windows.h> 

// to move back to the beginning and output again 
void gotoxy (int x, int y) 
{ 
    COORD coord; // coordinates 
    coord.X = x; coord.Y = y; // X and Y coordinates 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // moves to the coordinates 
} 

int main() 
{ 
    std::time_t now; 
    while (true) 
    { 
     gotoxy (0,0); 
     now = std::time(0); 
     std::cout << "The time is now: " << std::ctime(&now); 
     Sleep (20); 
    } 
    std::cin.get(); 
    return 0; 
} 
0

ここではユーティリティを使用しているサンプルが<chrono>です。このためにはC++ 11にアクセスする必要があります。

このモデルを簡単に使用してコードに適合させることができます。

#include <iostream> 
#include <chrono> 

using namespace std::chrono; 

int main() 
{ 
    int num; 

    // start timing 
    auto start = steady_clock::now(); 

    std::cin >> num; 

    // stop timing 
    auto stop = steady_clock::now(); 

    // stop - start will give you the time that passed 
    std::cout << "It took " 
       << duration_cast<milliseconds>(stop - start).count() 
       << " milliseconds!\n"; 

    std::cin.get(); 
} 

これは、開始宣言と停止宣言の間のすべての実行に要した時間を表示します。
duration_castにはseconds,microsecondsなどがあります。

+0

はい、入力に時間を要することがあります。しかし、プログラムが入力を待つのを止め、「Times up!」と言うだけの方法があります。 ? – Dosisod