在执行其他命令时运行计时器c ++

时间:2016-04-27 00:05:12

标签: c++ timer

所以我正在尝试为更大的项目创建概念证明。我目前正在进行一次定时测验,只有一个问题,你有10秒的时间可以回答。

我真正想要的是什么

  • 我知道我可以通过

    读取用户输入

    " cin<< VAR"或" Var = _getch()"

  • 我可以通过

    制作计时器

    clock_t timer;

    timer = clock();

    //代码

    timer = clock() - t;

  • 但你怎么把它们放在一起呢?你可以在要求输入时运行计时器吗?它看起来并不像,因为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;
    }
    

对于间距很抱歉,它有点混乱。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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中,您可以使用secondsmicroseconds和其他。

答案 2 :(得分:0)

当节目等待输入时,时钟继续运行,因此输入操作的定时没有问题(即看看花了多长时间)。但是如果您想在10秒钟后中止输入操作,那么您必须使用特定于平台的方法,例如键盘轮询。所有标准C ++输入操作都是阻塞的。因此,只使用标准C ++,您可以尝试将输入操作放在其自己的执行线程中,推理异步,即线程的用途。但是你发现在等待输入的时候没有办法终止那个帖子,并且(有创意)没办法发布虚假输入。

仍然,关于

  

您可以在要求输入时运行计时器吗?

如果你想要时间显示,为什么,这没问题。

你可以把它放在自己的线程中。

但是,如果您希望每行输入多个单个字符,那么您可能必须使用特定于系统的方法,因为标准库的文本显示修改工具(基本上由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";
}