C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > c++定时执行函数

使用 c++ 在 windows 上定时执行一个函数的示例代码

作者:saplonily

这篇文章主要介绍了使用c++在windows上稳定定时执行一个函数,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
#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 为

那么结合上述几个 api 以及几个简单的数学运算, 这样就可以相对稳定的定时调用函数了(在这里是 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的调用后你会发现结果不是很乐观(即使我们期望 1s 调用 60 次):

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

最后, 这个可能常见于游戏的帧率控制, 实际上我就是从这里知道的这些东西(x

到此这篇关于使用 c++ 在 windows 上稳定定时执行一个函数的文章就介绍到这了,更多相关c++定时执行函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文