【问题标题】:C++ duration_cast<>(time_point_end - tine_point_start). count() overflowsC++ duration_cast<>(time_point_end - tine_point_start)。 count() 溢出
【发布时间】: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 个输出。当您增加所需的延迟时,您将获得更少的输出,这是完全正常的。
  • 为什么会溢出?更具体地说明您获得的结果,并解释与您想要的结果的不同之处,并解释为什么您认为应该获得您想要的结果。
  • 您对为什么要这样做的描述令人困惑。为什么要阻止处理器在等待时做任何事情?

标签: c++ duration


【解决方案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 成为现在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2012-12-20
    • 2011-03-02
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多