C++ duration_cast<>(time_point_end - tine_point_start)。 count() 溢出

Posted

技术标签:

【中文标题】C++ duration_cast<>(time_point_end - tine_point_start)。 count() 溢出【英文标题】:C++ duration_cast<>(time_point_end - tine_point_start). count() overflows 【发布时间】:2020-01-10 18:25:01 【问题描述】:

我想做的,我的项目:

我想做一个等待 0.5 秒的程序,例如,做某事,比如说cout &lt;&lt; "Hello World",一次又一次相同的大约 10 次(这是对另一个程序的测试),但没有睡眠, sleep_for、sleep 或任何类似的 BCS 我不希望处理器真正进入睡眠状态,当时的 BCS 处理器不只是等待,它在那段时间什么也不做,在这 0.5 秒内它什么也不做,我不想要那个,主要原因是 BCS 也不接受输入。

我尝试了什么:

我尝试的是在 for 循环中保留两个时间点(time_point start,end),duration_cast 它们的差异(end - start)((int i = 0;i

#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
using namespace chrono;

int main()

    time_point<steady_clock> t = steady_clock::now():
    for (int i = 0; i < 10;)
    
        duration<double> d = steady_clock::now() - t;
        uint32_t a = duration_cast<milliseconds>(d).count();
        if (a >= 500)
        
            cout << a << " Hello World!" << endl;
            t = steady_clock::now();
            i++;
        
    
    return 0;

我的问题:

它溢出,大多数时候,我不知道究竟是什么溢出,但 a 有时似乎是 6?其他 47??? (?=某个数字) 我尝试了很多东西,我最终得到了这样的结果:

#include <iostream>
#include <chrono>
#include <ctime>
using namespace std;
using namespace chrono;

int main()

    time_point<high_resolution_clock> t = high_resolution_clock::now();
    for (int i = 0; i< 10;)
    
        duration<double,ratio<1,1000000>> d = high_resolution_clock::now() - t;
        uint32_t a = duration_cast<microseconds>(d).count();
        if (d >= microseconds(500000) )
        
            cout << a << " Hello World!" << endl;
            i++;
            t = high_resolution_clock::now();
        
    
    return 0;

它并没有真正解决问题,但出现的最大值是`~1500(1500000 以微秒为单位),当它发生时打印消息需要更长的时间,我不知道它是否仍然溢出,是老实说,但是...

问题

不管怎样,你对如何停止溢出或完全不同的方式来实现我想要的有什么建议,即使你没有,谢谢你花时间阅读我的问题,我希望表达别人的问题如果有人和我有同样的问题。

【问题讨论】:

用C标签标记C++问题。 溢出是指时间跨度高于预期吗? 您的 for 循环仅循环 10 次。如果a &lt;= [timeout] 比您丢失该迭代的打印,您将不会获得 10 个输出。当您增加所需的延迟时,您将获得更少的输出,这是完全正常的。 为什么会溢出?更具体地说明您获得的结果,并解释与您想要的结果的不同之处,并解释为什么您认为应该获得您想要的结果。 您对为什么要这样做的描述令人困惑。为什么要阻止处理器在等待时做任何事情? 【参考方案1】:

不确定这是否是您要查找的内容。但如果没有,也许我们可以在此基础上确定您想要什么:

#include <chrono>
#include <iostream>

int
main()

    using namespace std;
    using namespace std::chrono;

    auto t = steady_clock::now();
    for (int i = 0; i < 10; ++i)
    
        auto t1 = t + 500ms;
        while (steady_clock::now() < t1)
            ;
        cout << duration<double>(t1-t).count() << " Hello World!" << endl;
        t = t1;
    

代码将time_point 设置为未来500 毫秒,然后进入繁忙循环,直到未来time_point 成为现在。

【讨论】:

以上是关于C++ duration_cast<>(time_point_end - tine_point_start)。 count() 溢出的主要内容,如果未能解决你的问题,请参考以下文章

std::chrono::duration_cast - 比纳秒更精确的单位?

c ++ chrono给出负纪元时间

如何旋转模型以跟随路径

C++读写文件

c++:向量<string>的迭代

C++重载<<>>