最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年07月21日 08:40:02   作者:saplonily  
這篇文章主要介紹了使用c++在windows上穩(wěn)定定時執(zhí)行一個函數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(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" ).
    它的作用是請求提高一些計(jì)時器的精度比如這里的Sleep, 默認(rèn) windows 似乎只會給我們提供 10ms 左右很粗糙的精度, 所以這里我們直接請求盡可能的高的精度, 即 1ms.

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

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

那么結(jié)合上述幾個 api 以及幾個簡單的數(shù)學(xué)運(yùn)算, 這樣就可以相對穩(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

當(dāng)你注釋掉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

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

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

相關(guān)文章

  • C語言實(shí)現(xiàn)動態(tài)擴(kuò)容的string

    C語言實(shí)現(xiàn)動態(tài)擴(kuò)容的string

    最近工作中使用C語言,但又苦于沒有高效的字符串實(shí)現(xiàn),字符串的拼接和裁剪都很麻煩,而且每個字符串都需要申請內(nèi)存,內(nèi)存的申請和釋放也很容易出bug,怎么高效的實(shí)現(xiàn)一個不需要處理內(nèi)存問題并且可以動態(tài)擴(kuò)容進(jìn)行拼接和裁剪的string呢?本文就來詳細(xì)講講
    2023-04-04
  • linux下access函數(shù)的用法介紹

    linux下access函數(shù)的用法介紹

    access檢查用戶對一個文件的權(quán)限情況,根據(jù)mode的值檢查調(diào)用進(jìn)程對文件pathname是否具有讀、寫、或執(zhí)行的權(quán)限
    2013-08-08
  • C++實(shí)現(xiàn)旅館住宿管理系統(tǒng)

    C++實(shí)現(xiàn)旅館住宿管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)旅館住宿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++獲取數(shù)組大小和多維數(shù)組操作詳解

    C++獲取數(shù)組大小和多維數(shù)組操作詳解

    這篇文章主要介紹了C++獲取數(shù)組大小和多維數(shù)組的操作,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)

    C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中的正則表達(dá)式使用示例詳解

    C語言中的正則表達(dá)式使用示例詳解

    正則表達(dá)式是使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。本文通過示例代碼給大家介紹了C語言中的正則表達(dá)式使用,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • 在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法

    在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法

    本篇文章是對在vs2010中,輸出當(dāng)前文件路徑與源文件當(dāng)前行號的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • VC判斷進(jìn)程是否具有administrator權(quán)限的方法

    VC判斷進(jìn)程是否具有administrator權(quán)限的方法

    這篇文章主要介紹了VC判斷進(jìn)程是否具有administrator權(quán)限的方法,在Windows應(yīng)用程序設(shè)計(jì)中具有一定的實(shí)用價值,需要的朋友可以參考下
    2014-10-10
  • C語言入門篇--sizeof與strlen基礎(chǔ)理論

    C語言入門篇--sizeof與strlen基礎(chǔ)理論

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的sizeof與strlen的基本理論知識,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C語言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    C語言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    楊輝三角是中國古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來,是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試
    2022-01-01

最新評論

观塘区| 改则县| 政和县| 德保县| 阿尔山市| 沙河市| 太白县| 秦安县| 柯坪县| 永州市| 沙河市| 芦山县| 呼伦贝尔市| 内丘县| 宜春市| 永年县| 西峡县| 博客| 衢州市| 金阳县| 达尔| 灵川县| 沙湾县| 长丰县| 洛隆县| 柳林县| 从化市| 曲水县| 黑山县| 商河县| 遵义县| 宣武区| 伊宁县| 滨海县| 延津县| 万州区| 沁源县| 祁门县| 四会市| 若尔盖县| 徐水县|