c++ - 带有 chrono::sleep_until 的奇怪日志记录时间戳
问题描述
我正在 Windows 10 上的 UDP 通信期间测试应用程序的延迟。
我尝试每 1 秒发送一条消息,并立即收到从遥控器发送的响应。
发送线程
它每 1 秒工作一次。
auto start = std::chrono::system_clock::now();
unsigned int count = 1;
while (destroyFlag.load(std::memory_order_acquire) == false)
{
if (isReady() == false)
{
break;
}
/*to do*/
worker_();
std::this_thread::sleep_until(start + std::chrono::milliseconds(interval_)* count++);
}
worker_()
发送线程调用这个。只需发送消息并制作日志字符串。
socket_.send(address_);
logger_.log("," + std::string("Send") + "\n");
Receiver
当消息到达时,它会创建一个接收日志字符串并将其刷新到一个文件中。
auto& queueData = socket_.getQueue();
while (queueData.size() > 0)
{
auto str = queueData.dequeue();
logger_.log(",Receive" + str + "\n");
logger_.flush();
}
我已经在一夜之间对其进行了测试,但我无法弄清楚为什么会得到这个结果。
x 轴:Hour_Minute_second
y 轴:微秒
几个小时后,它似乎按预期工作。但在那之后,时间逐渐变化,去了不同的时区。
有谁知道为什么会这样?
解决方案
std::chrono::steady_clock 正在工作。
它使我的图表笔直。
还有一种方法,关闭windows自动时间同步。
推荐阅读
- css - 多个粘性元素在 Firefox 中消失
- java - 如何使用 ROLES 正确保护端点?
- python - np.where 有两个条件
- java - 在 Android 垃圾邮件上旋转屏幕保存的实例状态和 ActivityResultRegistry
- java - 401 on request where `permitAll()` 指定
- sql - 在 powershell 和 SQL 中转义双引号
- r - 在加载许多包时确定哪个版本的函数处于活动状态
- excel - 如果值在工作表 A 的列中但不存在于工作表 B 的列中,则将该值添加到工作表 B
- python - 是否可以将 .py 转换为包含所有图像和图标文件的单个 .exe 文件
- rdkit - 为什么 H 会因为 H 不存在的结构而出现微笑