Chrono C ++给出实时经过的时间

Pen*_*833 2 c++ class timer c++-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";
Run Code Online (Sandbox Code Playgroud)

最终,我有一个结构队列,它们在我处理后的循环中突然弹出。在每次循环迭代结束时打印时,它们需要时间戳记。我只是无法终生获得计时器来提供循环中经过的时间(甚至无法工作)。

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

编辑***

所以这是我当前在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
Run Code Online (Sandbox Code Playgroud)

然后我从meta.cpp开始时间

 void Meta::startTimer()
      {
           startTime = timer::now();
      }
Run Code Online (Sandbox Code Playgroud)

这是缺少一些片段的循环,因此我们可以专注于计时器:

 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;
Run Code Online (Sandbox Code Playgroud)

}

How*_*ant 5

timer::time_point elapsed_time; // this is my issue
Run Code Online (Sandbox Code Playgroud)

仅仅从名字上来看elapsed_time,这听起来并不像一个time_point。听起来像是duration。这样做可以解决该问题:

timer::duration elapsed_time;
Run Code Online (Sandbox Code Playgroud)

这看起来很可疑:

float waitTime = float(temp.ncycle)/1000;
Run Code Online (Sandbox Code Playgroud)

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

elapsed_time = timer::duration_cast<chrono::milliseconds>(clock_check - clock_wait);
Run Code Online (Sandbox Code Playgroud)

duration_cast不是的静态成员函数system_clockduration_cast是名称空间作用域函数。像这样使用它:

elapsed_time = chrono::duration_cast<chrono::milliseconds>(clock_check - clock_wait);
Run Code Online (Sandbox Code Playgroud)

如果waitTime具有duration类型,则.count()在这里是不必要的:

if (elapsed_time.count() > waitTime)
Run Code Online (Sandbox Code Playgroud)
// 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());
Run Code Online (Sandbox Code Playgroud)

最佳做法是保留在<chrono>类型系统中,而不要转义到标量,例如float。您可以通过以下方法获得整数毫秒:

auto EndTime = chrono::duration_cast<chrono::milliseconds>(end_time - startTime);
Run Code Online (Sandbox Code Playgroud)

如果您真的想EndTime基于浮点数的毫秒数,那也很容易:

using fmilliseconds = chrono::duration<float, std::milli>;
fmilliseconds EndTime = end_time - startTime;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,这是该<chrono>库的视频教程:https : //www.youtube.com/watch?v=P32hvk8b13M


如果此答案不能解决您的问题,请将您的问题简化为一个完整的最小程序,其他人可以将其复制/粘贴到其编译器中并进行尝试。例如,waitTime由于我不知道是什么,所以我无法给您具体的建议temp.ncycle


最后,这是可选的,如果您想要一种更简便的方法来流逝持续时间以进行调试,请考虑使用我的免费,开放源代码,仅标头的日期/时间库。可以这样使用:

#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
}
Run Code Online (Sandbox Code Playgroud)

只是为我输出:

25729µs
Run Code Online (Sandbox Code Playgroud)

持续时间的编译时单位会自动附加到运行时值,以便更轻松地查看所拥有的内容。这样可以防止您不小心将错误的单元附加到输出中。