这是一个明确的问题: 你能提供一个从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;
}
答案 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
持续时间的编译时单位会自动附加到运行时值,以便更容易看到您拥有的内容。这可以防止您意外地将错误的单位附加到输出中。