c++ - 高精度事件定时器

标签 c++ windows visual-c++ timer operating-system

#include "target.h"
#include "xcp.h"
#include "LocatedVars.h"
#include "osek.h"


/**
 * This task is activated every 10ms.
 */
long OSTICKDURATION;
TASK( Task10ms )
{
    void XCP_FN_TYPE Xcp_CmdProcessor( void );
    uint32 startTime = GetQueryPerformanceCounter();

    /* Trigger DAQ for the 10ms XCP raster. */
    if( XCPEVENT_DAQ_OVERLOAD & Xcp_DoDaqForEvent_10msRstr() )
    {
        ++numDaqOverload10ms;
    }

    /* Update those variables which are modified every 10ms. */
    counter16 += slope16;

    /* Trigger STIM for the 10ms XCP raster. */
    if( enableBypass10ms )
    {
        if( XCPEVENT_MISSING_DTO & Xcp_DoStimForEvent_10msRstr() )
        {
            ++numMissingDto10ms;
        }
    }



    duration10ms = (uint32)( ( GetQueryPerformanceCounter() - startTime ) / STOPWATCH_TICKS_PER_US );
}

从 C++ 同步到某个精确时钟以在特定时间间隔调用函数(在正常情况下几乎没有抖动)的最简单(和/或最好)方法是什么?我现在在WINDOWS操作系统上工作。 上面的代码适用于 RTAS OSEK,但我想在 Windows 操作系统的特定时间间隔调用函数。任何人都可以用 C++ 语言帮助我吗?

最佳答案

新应用程序应使用 CreateTimerQueueTimer!

此队列中的计时器(称为计时器队列计时器)是轻量级对象,使您能够指定在指定的到期时间到达时调用的回调函数。等待操作由线程池中的线程执行。

CreateTimerQueueTimer function 。示例:Using Timer Queues (C++)。

但是,粒度约为1ms,设置10ms可能会导致9/11ms周期性卡顿。

要获得更高的分辨率,您可能必须使用 Clock::now() 设置定时器轮,如所述 here .

关于c++ - 高精度事件定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19638163/

相关文章:

c++ - cout long double 问题

c++ - 调用 QueryPerformanceCounter 时会发生什么?

python.exe is not a valid win32 application 突然出现错误

c# - Windows.UI.ViewManagement.ApplicationView.TryUnsnap() 已过时

windows - 批处理文件调用 vbs 不会从任务计划程序运行

.net - MySQL Workbench 5.2.42 在 Win7 x64 上启动时崩溃

c++ - 无法编译,需要左值,在函数 main 中

c++ - 如何使用顶点位置坐标进行纹理处理? OpenGL,C++

qt - 安装Qt 5.6.1 MSVC 2015 Update 3

c++ - 是否存在 C4930 Visual C++ 警告未指示错误的真实案例?