Chrono C ++提供实时经过的时间

时间:2017-10-07 06:27:03

标签: c++ class timer chrono

这是一个明确的问题: 你能提供一个从main(或它自己的类)调用并在另一个类中使用的chrono的简单例子。或者是示例的链接。

以下是我在试图更详细地解释我的问题时摸索着:

我一整天都在努力,并且一直在同一个地方。 我正在编写一个程序,该程序应该在某些进程完成后输出经过的时间。 我遇到的问题是这些过程发生在不同的类中,我无法让时钟正常工作。 我一直在恢复主要时钟,但我真的很努力让一切都融合在一起。所以这可能是一个关于使用类的简单问题。但有些事情我不理解,我不知道它是什么。

下面是这个计时器的4行,我一直回复并放入我的主函数中。它以格式x.xxxxxx

打印我想要的时钟
auto clock_start = chrono::system_clock::now();
auto clock_now = chrono::system_clock::now();
float currentTime = float(chrono::duration_cast <chrono::microseconds> (clock_now - clock_start).count());
cout << "Elapsed Time: " << currentTime /1000000 << " S \n";

最终, 我有一个结构队列,我在循环中弹出然后我操纵。在每次循环迭代结束时打印时需要时间戳。 我只是不能为我的生活让计时器在循环中给出时间(甚至工作)。

这可能吗?我已经在chrono上阅读了许多线程,当我尝试在我的程序中使用多个类/函数中的计时器时,我没有点击我。

EDIT ***

这是我在meta.h中的当前类: 这些是Meta类中的私有成员

typedef std::chrono::system_clock timer;
timer::time_point currentTime;
timer::time_point startTime;
timer::time_point clock_wait;
timer::time_point clock_check;
timer::time_point elapsed_time; // this is my issue

然后我开始在meta.cpp

中抽出时间
 void Meta::startTimer()
      {
           startTime = timer::now();
      }

这是一个缺少一些部分的循环,所以我们可以专注于计时器:

 void Meta::displaySim()
 {
     //auto clock_start = chrono::system_clock::now(); THIS IS WHAT I WAS DOING
queue<sData>newFile;

while (!MetaQ.empty())
{
    temp = MetaQ.front();
    bool wait = true;
    float waitTime = float(temp.ncycle)/1000;
    while (wait)
    {
        clock_wait = timer::now();
        clock_check = timer::now();
        elapsed_time = timer::duration_cast<chrono::milliseconds>(clock_check - clock_wait);
        if (elapsed_time.count() > waitTime)
            wait = false;

    }
    cout << "****" << waitTime << "*****"<< endl;
    end_time = timer::now();
 //Below is the line that is giving me trouble now. I get an error when casting. I don't know how to make duration_cast part of the timer declared in meta.h
    float EndTime = float(timer::duration_cast <chrono::milliseconds>(end_time - startTime).count());
    cout << fixed << EndTime / 1000000  << " - (" << temp.desc << ')' << temp.cycle << " - " << temp.ncycle << " ms\n";
    newFile.push(temp);
    MetaQ.pop();
}

MetaQ = newFile;

}

1 个答案:

答案 0 :(得分:4)

timer::time_point elapsed_time; // this is my issue

仅从名称elapsed_time开始,这听起来不像time_point。听起来像duration。这样做是为了解决这个问题:

timer::duration elapsed_time;

这看起来很可疑:

float waitTime = float(temp.ncycle)/1000;

通常,持续时间应为std::chrono::duration<some representation, some period>类型。而且您不想手动应用转化因子,例如1/1000。让<chrono>处理所有转化。

elapsed_time = timer::duration_cast<chrono::milliseconds>(clock_check - clock_wait);

duration_cast不是system_clock的静态成员函数。 duration_cast是命名空间范围函数。像这样使用它:

elapsed_time = chrono::duration_cast<chrono::milliseconds>(clock_check - clock_wait);

如果waitTime的{​​{1}}类型为duration,则此处不需要.count()

if (elapsed_time.count() > waitTime)
// Below is the line that is giving me trouble now. I get an error when casting.
// I don't know how to make duration_cast part of the timer declared in meta.h
float EndTime = float(timer::duration_cast <chrono::milliseconds>(end_time - startTime).count());

最佳做法是保留在<chrono>类型系统中,而不是转移到float之类的标量。你可以用这个来获得整数毫秒:

auto EndTime = chrono::duration_cast<chrono::milliseconds>(end_time - startTime);

如果你真的希望EndTime是基于浮点数的毫秒,那也很容易:

using fmilliseconds = chrono::duration<float, std::milli>;
fmilliseconds EndTime = end_time - startTime;

有关详细信息,请参阅<chrono>库的视频教程:https://www.youtube.com/watch?v=P32hvk8b13M

如果这个答案没有解决您的问题,请将您的问题提炼为完整的最小程序,其他人可以将其复制/粘贴到编译器中并尝试。例如,我无法就waitTime给出具体建议,因为我不知道temp.ncycle是什么。

最后,这是可选,如果您想要一种更简单的方法来流出持续时间以进行调试,请考虑使用我的free, open source, header-only date/time library。它可以像这样使用:

#include "date/date.h"
#include <iostream>
#include <thread>

using timer = std::chrono::system_clock;
timer::time_point clock_wait;
timer::time_point clock_check;
timer::duration elapsed_time;

int
main()
{
    using namespace std::chrono_literals;
    clock_wait = timer::now();
    std::this_thread::sleep_for(25ms); // simulate work
    clock_check = timer::now();
    elapsed_time = clock_check - clock_wait;
    using date::operator<<;  // Needed to find the correct operator<<
    std::cout << elapsed_time << '\n';  // then just stream it
}

只为我输出:

25729µs

持续时间的编译时单位会自动附加到运行时值,以便更容易看到您拥有的内容。这可以防止您意外地将错误的单位附加到输出中。