毫秒级定时器

Windows多媒体定时器(精确到1ms) MFC使用多媒体定时器,Windows多媒体定时器,多媒体定时器封装 阅读详情

1.       windows平台用微软提供的多媒体定时器。

2.       linux平台用select方案。

 

  多媒体定时器方案:

   Visual C++中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。Visaul C++中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时间隔(退出程序时别忘了调用和SetTimer()配对使用的KillTimer()函数),如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法非常简单,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

  微软公司在其多媒体Windows中提供了精确定时器的底层API支持。利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时。1)使用timeGetTime()函数,该函数定时精度为ms级,返回从Windows启动开始所经过的时间。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。2)使用timeSetEvent()函数,该函数原型如下:

 

 

MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD dwUser,UINT fuEvent);

 

 

该函数的参数说明如下:参数uDelay表示延迟时间;参数uResolution表示时间精度,在Windows中缺省值为1ms;lpTimeProc表示回调函数,为用户自定义函数,定时调用; 参数dwUser表示用户提供的回调数据;参数fuEvent为定时器的事件类型,TIME_ONESHOT表示执行一次;TIME_PERIODIC:周期性执行。具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在lpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。

 

 

#ifdef WIN32

    if (NULL != g_TimerID)

    {

        MMRESULT ret;

        ret = timeKillEvent(g_TimerID);

        if (TIMERR_NOERROR != ret)

        {           

            g_debug("timeKillEvent failed.");

        }

        else

        {

            g_TimerID = NULL;    

        }

    } 

   

    {

        g_TimerID = timeSetEvent(40, 1,    //40毫秒

            (LPTIMECALLBACK) DoProcess,

            (DWORD)this,TIME_PERIODIC);

       

        if (NULL == g_TimerID)

        {

            g_debug("create mm timer failed.");

        }

    }   

#endif

 

 

 

select方案:  

 

struct timeval tv;

    struct sched_param task_param;   

    //提高优先级

    task_param.sched_priority = 80;

   

    if( pthread_setschedparam(pthread_self(), SCHED_FIFO, &task_param) )

    {

        g_debug("set task priority failed: %s/n", strerror(errno));

    }

 

    BOOL32 bActive = TRUE;

   

    while(bActive)

    {       

      

        bActive = GetActiveStatus();

 

        //定时器

        for (l32 i = 0; i < 40; i++)  //40毫秒

        {

            tv.tv_sec = 0;  

            tv.tv_usec = 1000;          

            select(0, NULL, NULL, NULL, &tv); 

        }       

           

        g_mutex_lock((GMutex*)(ptLock));

        g_cond_signal((GCond*)(ptCond));

        g_mutex_unlock((GMutex*)(ptLock));                

    }

 

 

 

Select方案关键点:  

1)      用select作定时器要单独起线程并且提高线程优先级。

2)      线程中除了给信号不做其它任何有负载的工作。

3)      Select语句要用循环实现。

 

 

内核信息:

Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i68

 

Swoole定时器实现毫秒级任务调度 Timer` 毫秒精度的定时器,底层基于 `epoll_wait` 和 `setitimer` 实现,数据结构使用`最小堆`,可支持添加大量定时器,使用最小堆数据结构实现的定时器,类似 JavaScript 的 `setInterval`,`Swoole` 定时器的添加和删除,全部为内存操作,因此性能是非常高的。需要执行一次定时器的时候可以使用 `Timer::after` , 此函数是一个一次性定时器,与间隔时钟定时器不同,执行完成后就会销毁,需要注意的是 `Timer::after` 是非阻塞的。 阅读详情

相关推荐

VC++实现毫秒级定时器源代码解析

SetTimer函数是Windows API中用于创建一个定时器的函数。该函数可以为应用程序生成一个定时器消息WM_TIMER,该消息会发送到消息队列中,当定时器到达指定的时间间隔时,会触发消息泵处理该消息,并执行与定时器关联的回调函数或窗口函数。使用SetTimer时,应用程序需要指定定时器的ID、超时值(以毫秒为单位)以及一个可选的回调函数。回调函数将被系统调用,每当定时器到期时。如果应用程序指定NULL回调函数,则Windows将向具有定时器ID的消息队列发送一个WM_TIMER消息。

weixin_33375360的博客 548

Windows实现高精度定时器的三种方法

前段时间一个项目需要用到1/24s的高精度定时器,每秒的误差不能超过10ms,大约41.666666666毫秒的延时,普通Sleep肯定是没办法满足的了,可以用以下新的三种方法: /* // 1秒=1000毫秒(ms) // 1毫秒=1/1000秒(s) // 1秒=1000000 微秒(μs) // 1微秒=1/1000000秒(s) // 1秒=1000000000 ...

Koma的主页 3万+

VC++6.0中的毫秒级定时器设计与实现

在VBA(Visual Basic for Applications)中,OnTime方法是一种程序控制指令,它能够指定代码在将来的某个时间点被执行。这为开发人员提供了在特定时刻触发事件的能力,例如安排一个宏在未来的特定时间执行。从概念上讲,OnTime方法类似于一个定时任务,但它是内置于应用程序的,而不是操作系统层面的。这使得它非常适合需要在应用程序内部精确计时的场景。在Windows编程中,SetTimer函数用于创建一个定时器,该定时器能够在指定的超时值后引发一个。

weixin_30533301的博客 1225

Windows毫秒精度定时器SetTimer

#include<iostream> #include <Windows.h> using namespace std; UINT id1, id2; /* hWnd: 窗口句柄 nMsg: 消息,这里是WM_TIMER nTimerid: 定时器id dwTime:当前系统时间,指从开机到现在所经过的毫秒数 */ void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { ...

gdizcm的专栏 1668

vc高精度定时器timeSetEvent

本实例可在VC或EVC运行通过,主要解决同WM_TIME定时器误差太大的问题,本例程的定时器精度1 ms....

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

Windows微秒级定时方法

在做硬件相关的程序时,需要大量的数据传输,当数据发送量大于设备接口接收量时会造成字节bit位覆盖的问题(比如单根串口线每次发送或者接收一个bit如果发送速度大于接收速度会造成前一个bit位被下一个bit位数据覆盖); **C语言本身提供的睡眠或者定时器方法最小单位为毫秒级(据了解最小时间为30毫秒左右,而且不够精准),对于要求高精准的硬件程序通常需要微妙级甚至纳秒级的精度,而C语言提供的方法远

大昱的博客 8468

C# 开发 WPS 插件实战:从环境搭建到功能实现(附完整代码)

本文提供了一份详尽的C#开发WPS插件实战指南,涵盖从环境搭建到功能实现的完整流程。通过COM技术,开发者可以创建自定义插件,为WPS Office扩展自动化功能,如文档处理与格式转换。文章包含核心概念解析、Ribbon界面集成、调试部署方法及完整代码示例,帮助开发者快速上手。

rust6ferris的博客 928

Windows下的高精度定时器实现及精确时刻获取

通讯、VOIP、视频等领域的很多核心技术对时间精度的要求非常高,比如数据采集、时间同步、媒体流平滑控制、拥塞算法等等,很多技术都是以毫秒为单位来进行计算和控制的。但是Windows设计之初并不是以实时系统为目标的,所以Windows系统的时间精度一直不高,实际最小单位是15ms左右,导致的结果就是所有Windows的时间、线程相关的操作都无法以1ms来实现精确控制。           受影响

singebogo的博客 2301

Windows平台无人机仿真:从零搭建SITL环境与QGC联调

本文详细指导了在Windows平台上从零搭建无人机软件在环(SITL)仿真环境,并与QGroundControl(QGC)进行联调的完整流程。通过使用Cygwin工具链,开发者可以在没有实体硬件的情况下,模拟运行ArduPilot飞控,并通过MAVLink协议连接QGC地面站进行全功能测试,为无人机软件开发提供了一个安全、经济的虚拟沙盒环境。

weixin_29239279的博客 412

【接地系统篇】电力系统接地技术详解:从基本原理到实际应用

接地是为电流返回电源提供的一条低阻抗通道。简单来说,就是为故障电流修建一条"安全回家"的路,防止电流通过人体或其他不应带电的部件。接地系统选择原则安全性优先:TN-S系统安全性最高,适合重要场所经济性考虑:TN-C系统成本最低,适合一般工业连续性要求:IT系统供电连续性最好,适合特殊场所灵活性选择:TN-C-S系统兼顾经济与安全,应用最广。

2301_81299416的博客 2231

Linux内核的毫秒级定时器

本文介绍了Linux内核中的毫秒级定时器开发技术,主要内容包括:1)定时器结构体timer_list的定义及各成员变量作用;2)常用定时器操作接口如mod_timer、del_timer等;3)通过示例程序test_timer.c演示了定时器的使用方式,该程序每5秒打印一次"timer process",展示了定时器的初始化和周期性触发机制。文章还说明了定时器相关头文件和标志位的含义,并提供了程序运行效果截图。

ych4444的博客 439

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

api在毫秒级触发了两次_Swoole 定时器实现毫秒级任务调度

Swoole 定时器简介Swoole 提供了异步高精度定时器功能,该功能类似 JavaScript 的 setInterval/setTimeout,粒度为毫秒级,底层基于 epoll_wait(异步)和 setitimer(同步)实现,数据结构使用最小堆。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。需要注意的是,Swoole 实现的定时器与 PHP 自带的 pcntl...

weixin_32989877的博客 203

学Simulink--基于多物理场耦合与系统集成的储能系统场景实例:压缩空气储能(CAES)系统的热力学建模与效率分析

本文提供了一个基于Simulink的压缩空气储能(CAES)系统热力学建模教程。通过多物理场耦合方法,详细演示了从系统架构设计到仿真测试的全过程,包括多级压缩机/膨胀机系统搭建、显热蓄热系统设计以及效率分析。文章重点强调了热管理对提升CAES效率的关键作用,并给出了68%电-电效率的优化案例。最后提出了变工况建模、不同蓄热介质对比等高级优化方向,为开发零碳大容量储能系统提供了实用工具和方法。

amy_mhd的博客 131

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

linux 定时器_Swoole 定时器实现毫秒级任务调度

Swoole 定时器简介Swoole 提供了异步高精度定时器功能,该功能类似 JavaScript 的 setInterval/setTimeout,粒度为毫秒级,底层基于 epoll_wait(异步)和 setitimer(同步)实现,数据结构使用最小堆。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。需要注意的是,Swoole 实现的定时器与 PHP 自带的 pcntl...

weixin_39951929的博客 483

超声相控阵合成孔径成像FPGA设计介绍

1.仿真预览 2.理论分析 系统的基本结构如下所示: 以上是实际中完整的结构,系统中会涉及到两块板子中的时钟,这个就是设计一个时钟采样同步的问题,即所谓的时钟同步。一般这种情况,往往使用内插的方式来解决。这是由于,在实际中,超生波接收到的信号是由本身系统发送出去反射回来得到的,因此从另外一方面将,其是同步的。但是在接收的时候通过内插的方法解决其中的延迟问题。 根据论文中的介绍,整个系统分为如下几个部分: ·模拟发送信号,这个部分由MATLAB产生测试数据并量...

FPGA/MATLAB学习教程/源码/项目合作开发 2071

毫秒级定时器模块的设计与实现

0、引言   定时器在服务器的通信模块中会广泛使用到,通过定时器可以相应的高效实现业务逻辑。由于一般给出的定时器都是以秒作为最小单元来处理的,大部分场景能够满足要求,但在一些特殊场景需要实现更精确的定时任务,这时候,就有必要去构建一个毫秒级的定时管理模块。因而本文分享了一种定时器管理模块的实现方法,同时给出了相应的使用案例,希望对读者有一定的帮助。 1、毫秒级的时间类型 首先构建一个毫秒级的...

weixin_33754065的博客 289

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PHP 毫秒级定时器,Swoole入门 - 毫秒定时器

常规定时器基于linux的crontab来实现,无法满足毫秒级、秒级处理任务的场景。swoole提供了类似JavaScript的setInterval/setTimeout异步高精度定时器Timer,粒度为毫秒级。使用也非常简单。在同步进程中使用setitimer和信号实现,如Manager和TaskWorker进程;在异步进程中使用epoll_wait/kevent/poll/select超时时...

weixin_29157361的博客 408

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux定时器日志_用Swoole 定时器实现毫秒级任务调度

Swoole 定时器简介Swoole 提供了异步高精度定时器功能,该功能类似 JavaScript 的 setInterval/setTimeout,粒度为毫秒级,底层基于 epoll_wait(异步)和 setitimer(同步)实现,数据结构使用最小堆。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。需要注意的是,Swoole 实现的定时器与 PHP 自带的 pcntl...

weixin_42528296的博客 220

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Swoole 快速起步:Timer 毫秒级定时器的使用

swoole 提供了类似 JavaScript 的 setInterval | setTimeout 异步高精度定时器 Timer,与PHP本身的pcntl_alarm相比,Timer更精确(毫秒级别)、性能更高(异步)、可同时设定多个定时器程序,本文以WebSocket 服务器为为例,在监听到新连接时,添加个定时器 demo。 文档介绍:https://wiki.swoole.co...

Phplayers的博客 1376

基于windows的毫秒级C++定时器类的实现

本文的重点还是类的实现,获取本地时间的WINAPI是GetLocalTime(),程序中仅此一个与平台相关的系统函数。 定时器功能:用户指定时间间隔和回调函数,每隔一段时间判断是否经过设定间隔,若是,执行回调函数。定时器共两个类型,DelayCall仅用于一次调用,AddTimer用于循环调用。 类型定义: /* 定时器 */ class Timer{ friend clas...

castle_kao的博客 3466

定时器精度对性能的影响_用Swoole 定时器实现毫秒级任务调度

php自学中心 2019-11-09 15:14:56Swoole 定时器简介Swoole 提供了异步高精度定时器功能,该功能类似 JavaScript 的 setInterval/setTimeout,粒度为毫秒级,底层基于 epoll_wait(异步)和 setitimer(同步)实现,数据结构使用最小堆。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。需要注意的是,S...

weixin_39785858的博客 150

总结定时器设计方法_Swoole 定时器实现毫秒级任务调度

Swoole 定时器简介Swoole 提供了异步高精度定时器功能,该功能类似 JavaScript 的 setInterval/setTimeout,粒度为毫秒级,底层基于 epoll_wait(异步)和 setitimer(同步)实现,数据结构使用最小堆。定时器的添加和删除,全部为内存操作,无 IO 消耗,因此性能是非常高的。需要注意的是,Swoole 实现的定时器与 PHP 自带的 pcntl...

weixin_39636718的博客 249
上一篇: BT中国联盟被关闭
下一篇: 程序员越老越优秀吗
marchbirdcode
博客等级 码龄17年 11粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值