簡體   English   中英

C ++不准確的計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM