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 << "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 <= [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() 溢出的主要内容,如果未能解决你的问题,请参考以下文章