2016-01-03 47 views
-1
#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。C++不準確的計時器

+1

你有沒有考慮與系統時鐘同步,而不是隻計算秒? –

+0

實際上什麼是'current_time'? –

+3

[C++中的時間計數器]的可能重複(http://stackoverflow.com/questions/33065568/a-time-counter-in-c) – YSC

回答

2

sleep_for確實的意思就像sleep_for_at_least。在實時操作系統上,您可能能夠完全依賴其喚醒時間,但在傳統操作系統上,它可以睡眠一段比指定時間長的任意時間。

如果您需要與掛鐘長期同步,通常需要計算下一次喚醒應該在數學上發生的時間(即,將目標持續時間乘以迄今爲止休眠的次數以獲得理想的喚醒時間)和sleep_until。這樣,每次喚醒都可能稍晚,但錯誤不會從一個累加到另一個。你可以通過計算喚醒時間和當前時間之間的差異來做到這一點,然後我們sleep_for這種差異,但這通常會犧牲一點準確性(獲得當前時間後的所有事情花費的時間)和額外的工作,因爲你仍然計算下一個喚醒時間。

2

這是預期的。睡眠對於至少是至少的睡眠時間,而不是一個精確的調度程序「在特定時間做某件事」。

你沒有考慮每秒實際運行你的代碼,或者從睡眠中醒來,或者再次開始睡眠所花費的時間......更別提你的計算機正在做的其他事情。有些漂移是正常的。

根據自上次「迭代」以來已經過去了多少實際時間,而不是睡1秒鐘,可以睡一定數量的微秒(可能是990,000?)。下一次醒來可能會稍微晚一點,但至少遲到不會累積,因爲隨後的「睡眠」論證會稍微短一些以彌補。

這是最好的天真調度程序,你會得到。

+0

問題是1次迭代的時間並不總是恆定的。 –

+1

@WalterWhite:那麼?你必須測量實時。正如所解釋的,每次都會有所不同。這就是關鍵所在! –

+0

@WalterWhite:對不起,你覺得我的回答沒有幫助你。 –