【问题标题】:Chrono C++ to give realtime elapsed timeChrono C++ 提供实时经过的时间
【发布时间】:2017-10-07 06:27:02
【问题描述】:

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

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

我整天都在做这件事,结果总是在同一个地方。 我正在编写一个程序,该程序应该在某些进程完成后输出经过的时间。 我遇到的问题是这些过程发生在不同的类中,我无法让时钟正常工作。 我一直在恢复以时钟为主,但我真的很难让所有东西都融合在一起。所以也许这是一个关于使用类的简单问题。但是有些东西我不理解,我不知道它是什么。

下面是这个计时器的 4 行,我一直在返回并放在我的 main 函数中。它以 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 上阅读了许多线程,当我尝试在我的程序中的多个类/函数中使用计时器时,有些东西对我来说并没有点击。

编辑***

所以这是我在 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;

}

【问题讨论】:

  • “甚至工作”并不是一个很好的问题描述。它没有给你任何结果,还是不是你所期望的?那么,你期待什么,你得到了什么?此外,如果您的循环没有做很多工作,它很可能会在不到一微秒的时间内完成。是这个问题吗?
  • 尝试发布代码,尝试从 main(或其自己的类)调用 chrono 并在另一个类中使用的简单示例。那么我毫不怀疑我们可以告诉你为什么这个例子没有按照你的意愿去做。
  • 你的问题还不清楚。你得到什么错误?这是一个例外吗? start_time 和 end_time 有什么价值?毕竟它们是整数,请检查您的调试器
  • 不应该 clock_wait = timer::now(); 在循环之前而不是里面?看起来像一个无限循环
  • 它告诉我 duration_cast 不是 Meta::timer 的成员

标签: c++ class timer chrono


【解决方案1】:
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&lt;some representation, some period&gt;。而且您不想手动应用 1/1000 之类的转换因子。让&lt;chrono&gt; 处理所有转换。

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 有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());

最佳做法是留在&lt;chrono&gt; 类型系统内,而不是转义为float 等标量。你可以得到整数毫秒:

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

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

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

更多细节,这里是&lt;chrono&gt;库的视频教程: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

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

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2023-03-13
    • 2020-04-02
    相关资源
    最近更新 更多