-3 c++
我想知道我们如何制作一个循环(例如,while 循环),其中 while 循环内的语句是基于时间的。
更清楚地说,例如我想制作一个while循环,我将每10秒输入一次。
伪代码如下:
while (10 seconds have passed)
{
//do Something
}
Run Code Online (Sandbox Code Playgroud)
那么,如何使上述伪代码成为现实呢?(我希望已经清楚了)
我通常使用这样的东西:
// for an easier life
using clock = std::chrono::steady_clock;
// set the baseline time
auto timeout = clock::now();
for(;;)
{
// (re)set timer
timeout += std::chrono::seconds(10);
// sleep until time has elapsed
std::this_thread::sleep_until(timeout);
// do something useful (like print the time)
auto timer = std::time(0);
std::cout << "loop: " << std::ctime(&timer) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
通过使用std::this_thread::sleep_until()循环CPU,在等待10秒数过去时不会消耗时间。
这可以包含在一个整洁的小类中,如下所示:
class wait_timer
{
using clock = std::chrono::steady_clock;
clock::duration time_to_wait;
clock::time_point timeout = clock::now();
public:
wait_timer(std::chrono::milliseconds ms)
: time_to_wait(ms), timeout(clock::now()) {}
void wait()
{
timeout += time_to_wait; // (re)set timer
std::this_thread::sleep_until(timeout);
}
};
int main()
{
// create it outside the loop so it doesn't
// loose track of time every iteration
wait_timer wt(std::chrono::seconds(2));
for(;;)
{
wt.wait();
// do something useful (like print the time)
auto timer = std::time(0);
std::cout << "loop: " << std::ctime(&timer) << '\n';
}
}
Run Code Online (Sandbox Code Playgroud)