- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Windows下的精确定时器
PAGE
PAGE1
Windows下的精确定时器
在日常的程序开发工作中,有时会遇到许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条等等。特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。
众所周知,Windows是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。另外,由于在Windows中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时,也比较困难。所以在实际应用时,应针对具体定时精度的要求,采取相适应的定时方法。
VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。
这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。
方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。
方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。以下是实现2秒的延时代码:
ColeDateTime start_time=COleDateTime::GetCurrentTime();COleDateTimeSpan end_time=COleDateTime::GetCurrentTime()-start_time;
while(end_time.GetTotalSeconds()2)
{
MSGmsg;
//实现延时2秒
GetMessage(msg,NULL,0,0);TranslateMessage(msg);DispatchMessage(msg);
//以上四行是实现在延时或定时期间能处理其他的消息,
//虽然这样可以降低CPU的占有率,
//但降低了延时或定时精度,实际应用中可以去掉。end_time=COleDateTime::GetCurrentTime()-start_time;
}//这样在延时的时候我们也能够处理其他的消息。
方式四:在精度要求较高的情况下,VC中可以利用GetTickCount(函)数,该函数的返回值是DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。精度比WM_TIMER消息高,在较短的定时中其计时误差为15ms,在较长的定时中其计时误差较低,如果定时时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。下列代码可以实现50ms的精确定时:
DWORDdwStart=GetTickCount();DWORDdwEnd =dwStart;
do
{
dwEnd=GetTickCount()-dwStart;
}while(dwEnd50);
为使GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码改为:DWORDdwStart=GetTickCount();
DWORDdwEnd =dwStart;do
{
MSG msg;GetMessage(msg,NULL,0,0);TranslateMessage(msg);DispatchMessage(msg);
dwEnd=GetTickCount()-dwStart;
}while(dwEnd50);
虽然这样可以降低CPU的占有率,并在延时或定时期间也能处理其他的消息,但降低了延时或定时精度。
方式五:与GetTickCount()函数类似的多媒体定时器函数DWORDtimeGetTime(void),该函数定时精度为ms级,返回从Windows启动开始经过的毫秒数。微软公司在其多媒体Windows中提供了精确定时器的底层
您可能关注的文档
- FPC制程要点分析和总结.docx
- GAP案例分析和总结.docx
- Genesis 2000 软件介绍分析和总结.docx
- Genesis2000软件介绍分析和总结.docx
- GIST分析和总结分析和总结.docx
- GRC简介及配方分析和总结.docx
- GRC建筑装饰构件.docx
- HP 激光打印机如何调节打印颜色的深浅.docx
- HP388A硒鼓加粉图解.docx
- hp1005硒鼓2612a加粉图解.docx
- 2025年大学《新闻学》专业题库—— 社交媒体的传播心理学分析.docx
- 遗传学教学大纲及考试重点.ppt
- 2025年大学《气象技术与工程》专业题库—— 高频天气预报系统的应用和发展.docx
- 2025年大学《会展》专业题库—— 会展活动中的安全风险与控制.docx
- 2025年大学《海洋科学与技术》专业题库—— 海洋资源管理政策调控与可持续利用监管.docx
- 2025年大学《会展》专业题库—— 会展行业品牌推广与传播策略.docx
- 2025年大学《地球化学》专业题库—— 地球化学在矿产资源勘探中的应用.docx
- 2025年大学《海洋科学》专业题库—— 海洋底栖生物群落与生物多样性.docx
- 2025年大学《会展》专业题库—— 线上线下会展融合发展模式.docx
- 2025年中国扁尾锤数据监测研究报告.docx
最近下载
- 汽车保险与理赔教学课件(简约版)项目2 车险赔款计算.pdf VIP
- 把自己重养一遍读书记录 .pdf VIP
- 2024年考试商业摄影师高级题库附答案.docx VIP
- 2024年摄影师技能理论知识考试题库(附答案).docx VIP
- 2024年艺术摄影师、商业摄影师等技能及理论知识考试题库(附含答案).docx VIP
- 2025年艺术摄影师、商业摄影师等技能及理论知识考试题库(附含答案).docx VIP
- 2025年艺术摄影师、商业摄影师等技能及理论知识考试题库(附含答案).docx VIP
- 2023年商业摄影师摄影技术方法及理论知识考试题库(附含答案).pdf VIP
- 笼养蛋鸡钙、磷与骨骼代谢规律及其调节机制-动物营养与饲料科学专业论文.docx VIP
- 2024年商业摄影师技能竞赛理论考试题库备赛500题(含答案).pdf VIP
原创力文档


文档评论(0)