[英]C++ inaccurate timer
#include <iostream>
#include "current_time.h"
#include <time.h>
#include <future>
#include <chrono>
#include <Windows.h>
using namespace std;
current_time mytimer;
void timer()
{
while(true)
{
mytimer.operator++(); //incerements seconds
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
void(*foo)(void);
foo = &timer;
auto future = async(foo);
while (1)
{
Sleep(50);
system("cls");
mytimer.disp_time();
}
}
我的后台計時器不正確。 等待了一段時間后,我注意到它越來越晚了。 我知道這是因為mytimer.operation ++()需要一些時間才能運行。 我一直在尋找解決方法,但找不到任何解決方法。 我目前正在使用VS15。
sleep_for
實際上意味着類似於sleep_for_at_least
東西。 在實時OS上,您可能可以完全根據其要求進行喚醒,但是在傳統OS上,它可以休眠比指定時間更長的任意時間。
如果您需要與掛鍾進行長期同步,通常需要計算下一次喚醒的時間,以數學方式進行計算(即,將預期持續時間乘以到目前為止的睡眠次數,以獲得理想的喚醒時間),然后sleep_until
那個時候。 這樣,每次喚醒可能會有些晚,但是錯誤不會一次累積到下一次。 您可以通過計算喚醒時間與當前時間之間的差值來實現,然后使用sleep_for
那個差值,但這通常會犧牲一點准確性(獲取當前時間之后的所有操作所花費的時間)和額外的工作,因為您仍然計算下一次喚醒時間。
這是預期的。 睡眠是至少持續一定時間的睡眠,而不是“在特定時間做某事”的精確調度程序。
您無需考慮實際每秒運行代碼,從睡眠中喚醒或重新開始睡眠所花費的時間..更不用說計算機在此期間所做的所有其他事情。 有些漂移是正常的。
根據自您上次“迭代”以來經過了多少實時時間,而不是睡眠1秒,而是要睡眠一定數量的微秒(也許是990,000?)。 下次喚醒可能會再稍晚一些,但至少不會延遲,因為您隨后的“睡眠”參數會稍短一些以進行補償。
那是您將獲得的最好的天真調度程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.