C++ 计时C++;给出实时经过的时间

C++ 计时C++;给出实时经过的时间,c++,class,timer,chrono,C++,Class,Timer,Chrono,这里有一个明确的问题: 您能否提供一个从main(或它自己的类)调用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";
然后我在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;
void Meta::displaySim()
{
//auto clock_start=chrono::system_clock::now();这就是我正在做的
队列文件;
而(!MetaQ.empty())
{
温度=MetaQ.front();
bool wait=true;
浮动等待时间=浮动(温度循环)/1000;
while(等待)
{
时钟等待=计时器::现在();
时钟检查=计时器::现在();
已用时间=计时器::持续时间(时钟检查-时钟等待);
if(已用时间.count()>waitTime)
等待=错误;
}
库特
仅从名称
经过的时间
,这听起来不像是
时间点
。听起来像是
持续时间
。请执行以下操作以解决该问题:

timer::duration elapsed_time;
这看起来很可疑:

float waitTime = float(temp.ncycle)/1000;
通常,持续时间应具有类型
std::chrono::duration
。您不希望手动应用转换因子,如
1/1000
。让
处理所有转换

elapsed_time = timer::duration_cast<chrono::milliseconds>(clock_check - clock_wait);
如果
waitTime
具有
duration
类型,则此处不需要
.count()

if (elapsed_time.count() > waitTime)

如果您确实希望
EndTime
是基于浮点的毫秒,这也很容易:

using fmilliseconds = chrono::duration<float, std::milli>;
fmilliseconds EndTime = end_time - startTime;
对我来说,这只是一个输出:

25729µs

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

“甚至工作”这不是一个很好的问题描述。它不会给你任何结果,或者它不是你期望的吗?那么,你期望什么,你得到了什么?另外,如果你的循环没有做很多工作,它很可能在不到一微秒的时间内完成。这是问题吗?试着发布代码,尝试调用一个简单的chrono示例从main(或其自己的类)导出在另一个类中使用。然后我毫不怀疑,我们可以告诉你为什么这个例子没有达到你想要的效果。你的问题仍然不清楚。你得到了什么错误?这是一个例外吗?什么值
start\u time
end\u time
有?它们毕竟是整数,检查你的调试程序不应该
clock\u wait=timer::now();
在循环之前而不是内部?看起来像一个无限循环它告诉我duration\u cast不是Meta::timer的成员
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());
auto EndTime = chrono::duration_cast<chrono::milliseconds>(end_time - startTime);
using fmilliseconds = chrono::duration<float, std::milli>;
fmilliseconds EndTime = end_time - startTime;
#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