gpt4 book ai didi

c++ - 使用 usleep 控制循环时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:34 26 4
gpt4 key购买 nike

我尝试通过 usleep 确保每个循环的执行时间为 10ms,但有时会超过 10ms。

我不知道如何解决这个问题,使用 usleepgettimeofday 是否合适这个案例?

请帮我找出我错过了什么。

Result: 0.0127289 0.0136499 0.0151598 0.0114031 0.014801

double tvsecf(){
struct timeval tv;
double asec;

gettimeofday(&tv,NULL);
asec = tv.tv_usec;
asec /= 1e6;
asec += tv.tv_sec;

return asec;
}
int main(){
double t1 ,t2;
t1 = tvsecf();
for(;;){
t2= tvsecf();
if(t2-t1 >= 0.01){
if(t2-t1 >= 0.011)
cout << t2-t1 <<endl;
t1 = tvsecf();
}
usleep(100);
}
}

最佳答案

为了防止循环开销(通常是未知的)不断累积错误,您可以 until point 而不是 for 一个时间 duration。使用 C++ 的 <chrono><thread>库,这非常简单:

#include <chrono>
#include <iostream>
#include <thread>

int
main()
{
using namespace std;
using namespace std::chrono;
auto t0 = steady_clock::now() + 10ms;
for (;;)
{
this_thread::sleep_until(t0);
t0 += 10ms;
}
}

可以通过多次调用 steady_clock::now() 来修饰它为了确定迭代之间的时间,也许更重要的是,平均迭代时间:

#include <chrono>
#include <iostream>
#include <thread>

int
main()
{
using namespace std;
using namespace std::chrono;
using dsec = duration<double>;
auto t0 = steady_clock::now() + 10ms;
auto t1 = steady_clock::now();
auto t2 = t1;
constexpr auto N = 1000;
dsec avg{0};
for (auto i = 0; i < N; ++i)
{
this_thread::sleep_until(t0);
t0 += 10ms;
t2 = steady_clock::now();
dsec delta = t2-t1;
std::cout << delta.count() << "s\n";
avg += delta;
t1 = t2;
}
avg /= N;
cout << "avg = " << avg.count() << "s\n";
}

上面我通过在循环中做更多的事情增加了循环开销。然而,循环仍然大约每 10 毫秒唤醒一次。有时操作系统会延迟唤醒线程,但下次循环会自动将自身调整为更短的休眠时间。因此平均迭代率自校正到 10ms。

在我的机器上这只是输出:

...
0.0102046s
0.0128338s
0.00700504s
0.0116826s
0.00785826s
0.0107023s
0.00912614s
0.0104725s
0.010489s
0.0112545s
0.00906409s
avg = 0.0100014s

关于c++ - 使用 usleep 控制循环时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com