使用Windows和c++的chrono为每个人安排一个1毫秒的事件——我是不是要求太多了?
Scheduling an event for everyone 1ms using Windows and C++ chrono - am I asking for too much?
我有一些像这样的代码:
while(true)
{
std::chrono::milliseconds NowSinceEpoch = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
if((NowSinceEpoch - LastUpdateSinceEpoch >= std::chrono::milliseconds(1)
{
DoSomething()
LastTimeSinceEpoch = duration_cast<milliseconds>(std::chrono::system_clock::now().time_since_epoch());
}
对于Windows和Chrono来说,这是不是有点太多了?它真的能用这么小的时间单位吗?我读过很多关于Windows在超过10毫秒的时间里挣扎的故事。我可以试试其他计时器库
谢谢你的帮助!
听起来你需要这样做:
#include <chrono>
int main()
{
using namespace std::chrono;
using clock = steady_clock;
auto time_up = clock::now() + milliseconds(1);
while(true)
{
std::this_thread::sleep_until(time_up);
// emit event
// set time_point for next millisecond
time_up += milliseconds(1);
}
}
我会用std::thread::sleep_for()
代替。
while(true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
DoSomething();
}
在等待调用DoSomething()
时,您的解决方案将消耗100%的CPU。通过调用sleep_for()
,您可以释放操作系统可能用于其他任务的时间
如果您仍然决定使用spin-wait而不是休眠线程,这可能会为您提供更好的粒度(sleep_for
只保证线程将在 最小给定时间内休眠),您应该使用high_resolution_clock
代替。
while(true)
{
auto lastDoSomethingTime = high_resolution_clock::now();
if((high_resolution_clock::now() - lastDoSomethingTime) >= milliseconds(1))
{
DoSomething()
lastDoSomethingTime = high_resolution_clock::now();
}
}
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- Windows 进程间同步类似事件?
- 如何从C++端挂接到 QML 项的 onClick 事件
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 如何在Qt 4.8中阻止/忽略/丢弃早于特定超时的用户输入事件
- C++ 信号和插槽不工作:插槽不响应事件
- 在虚幻引擎中触发C++ dll的事件
- 具有Qt事件循环的可移植通用共享库设置