允许每x ms运行一段时间
Allowing a while to run every X ms
我正在尝试使每10毫秒的循环运行一次。内部的代码非常简单,因此运行不需要大量时间。除了在末尾使用Sleep()
功能之外,还有其他方法吗?更准确的东西?
我正在使用Visual Studio。
而不是std::this_thread::sleep_for
,最好将sleep_until
用于此类延迟。这将自动考虑到循环中的其他代码要使用的时间(无论是否微不足道):
#include <chrono>
#include <iostream>
#include <thread>
int
main()
{
using namespace std::chrono;
auto next = steady_clock::now();
while (true)
{
std::cout << "hin";
next += 10ms;
std::this_thread::sleep_until(next);
}
}
在Windows上您可以使用Settimer。
但是,这可能会过度复杂化 - 特别是如果您的回调需要访问课程。您应该检查std :: this_thread :: sleep_for
std::this_thread::sleep_for(std::chrono::milliseconds(10));
如果您确实需要每10毫秒准确地运行一次,则最好在旋转循环中等待。伪代码:
while (your_condition)
{
var t = curTime;
do_what_you_need;
while (curTime - t < 10);
}
我会说,这应该足够准确。如果要使代码完全运行一次,则必须测量代码的执行时间,然后对10ms - <length of execution in ms>
睡觉。
以最佳的精度测量您可以使用High_resolution_Clock,至少以System_Clock速率运行或更高。http://www.cplusplus.com/reference/chrono/high_resolution_clock/
Sleep
和wareable计时器都在幕后使用螺纹,因此分辨率按默认时间切片的顺序,即10-20ms。如果您需要更高的分辨率,则应研究多媒体计时器。该文档有望比1MS分辨率更好。正如其他人所说的,手上的SetTimer
/WM_TIMER
接口似乎具有15.6ms的固定分辨率。
另一个高分辨率正时接口是性能计数器,但似乎您只能查询它们,不要等待任何东西,因此您会与它们进行空闲的等待循环(旋转)。
- 在做一段时间内检查字符的无限循环
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- ::grpc::ServerReaderWriter 对象在另一个线程中一段时间后无法调用
- 一段时间后 CPU 使用率高
- 有没有办法在一段时间后将流程从流出中分离出来
- 在一段时间内更改标签文本
- 布尔函数在一段时间内不起作用
- 解决PNP在一段时间后返回坏的rvec和tvec
- 相机的旋转方向在一段时间后反转
- boost::asio::d eadline_timer 1ms 滞后一段时间
- SDL_Mixer再次播放时,从随机位置开始一段时间,然后从头开始
- 您可以在一段时间内迭代向量
- 我可以在开关(消息)语句的同时运行一段时间吗?(C )
- 程序编译和运行,但一段时间后,它停止使用Typedef关键字在CPP上工作
- 允许每x ms运行一段时间
- LoadBitmap在程序运行一段时间后返回NULL
- 在Poco c++库中发送调用在运行一段时间后在Windows上不返回
- 由于ECHILD错误,C++中的system()函数在一段时间内运行良好,但在返回-1时失败.为什么?
- 性能问题与c++(使用vc++ 2010):在运行时,我的程序似乎随机等待一段时间