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