欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用?c++?在?windows?上定時執(zhí)行一個函數(shù)的示例代碼

 更新時間:2023年07月21日 08:40:02   作者:saplonily  
這篇文章主要介紹了使用c++在windows上穩(wěn)定定時執(zhí)行一個函數(shù),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
#include <iostream>
#include <Windows.h>
#include <thread>
#pragma comment( lib, "Winmm" )
static int counter = 0;
static int64_t ticks_per_second;
void __stdcall on_timer(HWND h, UINT ui, UINT_PTR up, DWORD dw)
{
    std::cout << "time out, counter=" << counter << std::endl;
    counter = 0;
}
void get_message_trd_func()
{
    SetTimer(NULL, 0, 1000, on_timer);
    MSG msg;
    while (GetMessageA(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
}
int main()
{
    std::cout << "go!" << std::endl;
    timeBeginPeriod(1);
    QueryPerformanceFrequency((LARGE_INTEGER*)&ticks_per_second);
    const double expected = 1.0 / 60.0;
    const int64_t expected_ticks = (int64_t)(expected * ticks_per_second);
    std::thread thr(get_message_trd_func);
    for (;;)
    {
        int64_t before_ticks = 0;
        QueryPerformanceCounter((LARGE_INTEGER*)&before_ticks);
        // do something...
        for (int i = 0; i < 10000; i++)
        {
            float a = i * i + i + sin(i) + sqrt(i);
        }
        int64_t after_ticks = 0;
        QueryPerformanceCounter((LARGE_INTEGER*)&after_ticks);
        counter++;
        int64_t ticks_need_sleep = expected_ticks - (after_ticks - before_ticks);
        double ms_need_sleep = (double)ticks_need_sleep / ticks_per_second * 1000.0;
        if (ms_need_sleep >= 1.0)
            Sleep((DWORD)ms_need_sleep);
        else
            continue;
    }
}

這里主要用到的幾個 win32api 為

  • MMRESULT timeBeginPeriod使用該 api 需要鏈接 Winmm, 所以我們在文件頂部加入#pragma comment( lib, "Winmm" ).
    它的作用是請求提高一些計時器的精度比如這里的Sleep, 默認 windows 似乎只會給我們提供 10ms 左右很粗糙的精度, 所以這里我們直接請求盡可能的高的精度, 即 1ms.

  • QueryPerformanceFrequency該 api 用于獲取"性能計時器"的精度, 單位是 ticks每秒. 在我的機子上它的值是 10000000, 可以看到精度還是很令人滿意的. 在這里我們將其與expected(也就是期望每次調(diào)用的間隔,單位s)進行相乘, 得到一個以ticks為單位的間隔.

  • QueryPerformanceCounter該 api 會檢測"性能計時器"的值, 單位為 ticks, 在 msdn 中其精度的描述為 <1us.

那么結(jié)合上述幾個 api 以及幾個簡單的數(shù)學(xué)運算, 這樣就可以相對穩(wěn)定的定時調(diào)用函數(shù)了(在這里是 1s 60 次):

time out, counter=59
time out, counter=59
time out, counter=60
time out, counter=59
time out, counter=58
time out, counter=60

當你注釋掉timeBeginPeriod的調(diào)用后你會發(fā)現(xiàn)結(jié)果不是很樂觀(即使我們期望 1s 調(diào)用 60 次):

time out, counter=33
time out, counter=31
time out, counter=32
time out, counter=31

最后, 這個可能常見于游戲的幀率控制, 實際上我就是從這里知道的這些東西(x

到此這篇關(guān)于使用 c++ 在 windows 上穩(wěn)定定時執(zhí)行一個函數(shù)的文章就介紹到這了,更多相關(guān)c++定時執(zhí)行函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解

    opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解

    今天小編就為大家分享一篇opencv3/C++關(guān)于移動對象的輪廓的跟蹤詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++多繼承(多重繼承)的實現(xiàn)

    C++多繼承(多重繼承)的實現(xiàn)

    多繼承容易讓代碼邏輯復(fù)雜、思路混亂,本文主要介紹了C++多繼承(多重繼承)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言的預(yù)處理介紹

    C語言的預(yù)處理介紹

    大家好,本篇文章主要講的是C語言的預(yù)處理介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言中進程間通訊的方式詳解

    C語言中進程間通訊的方式詳解

    這篇文章主要為大家詳細介紹了C語言中幾種進程間通訊的方式,文中的示例代碼講解詳細,?對我們學(xué)習(xí)或工作有一定的借鑒價值,需要的可以參考一下
    2022-08-08
  • C++日期類的實現(xiàn)日期計算器舉例詳解

    C++日期類的實現(xiàn)日期計算器舉例詳解

    這篇文章主要給大家介紹了關(guān)于C++日期類實現(xiàn)日期計算器的相關(guān)資料,我們要考慮日期的增加和減少,自增和自減,以及兩個日期類的比較,以及當前日期類的日期顯示和用戶的輸入輸出,需要的朋友可以參考下
    2024-05-05
  • C++中的最小生成樹算法超詳細教程

    C++中的最小生成樹算法超詳細教程

    這篇文章主要介紹了C++中的最小生成樹算法超詳細教程,最小生成樹的最著名的算法有兩個, 一個是Prim算法, 另一個當然就是Kruskal算法, 接下來, 我將盡我所能的介紹這兩個算法, 也算是對自己學(xué)習(xí)的一個回顧吧,需要的朋友可以參考下
    2023-08-08
  • QT使用QChart繪制柱狀圖

    QT使用QChart繪制柱狀圖

    在Qt中使用QChart類可以快速繪制一個圖表出來,比如折線圖、餅圖、柱狀圖等,本文就來為大家介紹一下如何利用QChart繪制簡單的柱狀圖吧
    2024-11-11
  • C++異常處理方式實例詳解(超級詳細!)

    C++異常處理方式實例詳解(超級詳細!)

    程序有時會遇到運行階段錯誤,導(dǎo)致程序無法正常執(zhí)行下去,c++異常為處理這種情況提供了一種功能強大的而靈活的工具,下面這篇文章主要給大家介紹了關(guān)于C++異常處理方式的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 關(guān)于C++菱形運算符深度解析

    關(guān)于C++菱形運算符深度解析

    從語言標準來說,c++里沒有什么菱形運算符,c++20里雖然新增了一個運算符operator<=>,但這個和所謂的菱形運算符沒有任何關(guān)系,下面通過本文探討C++里也有菱形運算符嗎這一問題探討,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • C++實現(xiàn)日期類(Date類)的方法

    C++實現(xiàn)日期類(Date類)的方法

    下面小編就為大家?guī)硪黄狢++實現(xiàn)日期類(Date類)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論