热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VC++使用媒体定时器的例子与源码

VC++默认的定时器,好像精度不大,秒内的不错,但是如果精确到毫秒(ms),不行,如果使用媒体定时器,multimediatimer,则效果显著,基本上精确到毫秒吧,一般的10ms之类的延时,

VC++默认的定时器,好像精度不大,秒内的不错,但是如果精确到毫秒(ms),不行,如果使用媒体定时器,multimedia timer,则效果显著,基本上精确到毫秒吧,一般的10ms之类的延时,应该可以保证了。

       如何使用呢?网上有例子,但没有完整的,大部分只是介绍,因此我根据网上的代码实现了一下,使用MFC实现,可以在下面的链接下载下来学习与研究。

       可能通过MSDN找到操作媒体定时器(multimedia timer)的相关介绍,主要的操作函数:

(1)timeSetEvent设置定时器(配置并开启)

(2)timeKillEvent关闭定时器

(3)CALLBACK TimerCallBack也可回调函数,(定时器中断了,要执行的函数),名字可以随便起,只是格式上,要符合标准的格式。

(4)OnMMTimer 具体的实现函数:网上是定义为虚函数,然后重写,这里我觉得随便取个名字应该可以,就是用定时器干什么,延时到了,用户要实现什么功能,可以写在这里。上面第三个函数就调用这个函数进行用户程序的实现。


(1)首先工程中要加入头文件:

#include "windows.h"
#include "Mmsystem.h"

(2)设置工程选项:加入Winmm.lib 库,这是使用媒体定时器的库。


界面如下:





对话框类的成员函数与成员变量:

public:
UINT m_ms;//毫秒,注意在构造函数里初始化为0
UINT m_timerId;
UINT m_s;
UINT m_m;
UINT m_h;
virtual void OnMMTimer();//声明要回调的成员方法
void TimerCtrl(const bool bEn);//定时器打开与关闭
int i;
MMRESULT TimerID;//媒体定时器的ID,标识


void CTimeSetEvent_V1Dlg::OnBtnTimerStart() 
{
// TODO: Add your control notification handler code here
TimerCtrl(TRUE);
GetDlgItem(IDC_BTN_TIMER_START)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_TIMER_STOP)->EnableWindow(TRUE);
}

void CTimeSetEvent_V1Dlg::OnBtnTimerStop()
{
// TODO: Add your control notification handler code here
TimerCtrl(FALSE);
GetDlgItem(IDC_BTN_TIMER_START)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_TIMER_STOP)->EnableWindow(FALSE);
}

void CTimeSetEvent_V1Dlg::OnMMTimer()
{
CString str = "";
m_ms++;
str.Format("%ld",m_ms);
str+="\r\n";
SetDlgItemTextA(IDC_STATIC_MS,str);
CEdit *pEt = (CEdit *)GetDlgItem(IDC_EDIT_HIST);
int nLen=pEt->GetWindowTextLength();
pEt->SetSel(nLen,nLen);
pEt->ReplaceSel(str);
//GetDlgItem(IDC_EDIT_HIST)->
}

void CTimeSetEvent_V1Dlg::TimerCtrl(const bool bEn)
{
if (bEn)
{
m_h = m_m = m_s = 0;
m_timerId = timeSetEvent(1,1,&TimerCallBack,(DWORD)this,TIME_PERIODIC);
}
else
timeKillEvent(m_timerId);
}

void CTimeSetEvent_V1Dlg::OnOK()
{
// TODO: Add extra validation here
GetDlgItem(IDC_EDIT_HIST)->SetWindowText("");
m_ms=0;
//CDialog::OnOK();
}

void CTimeSetEvent_V1Dlg::OnCancel()
{
// TODO: Add extra cleanup here

CDialog::OnCancel();
}



static void CALLBACK TimerCallBack(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CTimeSetEvent_V1Dlg * pThis=(CTimeSetEvent_V1Dlg *)dwUser;//由this指针获得实例的指针

pThis->OnMMTimer(); //调用要回调的成员方法
}

/////////////////////////////////////////////////////////////////////////////
// CTimeSetEvent_V1Dlg dialog

CTimeSetEvent_V1Dlg::CTimeSetEvent_V1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CTimeSetEvent_V1Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTimeSetEvent_V1Dlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_ms=0;
m_s=0;
m_m=0;
m_h=0;
}



       以上为主要的函数实现功能。

目前只是打印出数字来,证明定时器中断可以用,当然,如果设置什么数据发送,如1S中发送100次或是200次,也可以加入。


VC6工程下载:


点击打开链接


推荐阅读
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • ExcelApp#启动excel程序ExcelAppCreateOleObject(“Excel.Application”);#加载文件但不显示文件内容(true表 ... [详细]
  • java多线程获取线程返回结果
    我们在使用java多线程编写相关业务代码时,往往有这样一种情况,某个线程依赖于其他线程执行结果。也就是说,我们需要在一个线程中获取另一个线程的信息。可以分为两种情况,一种是轮询,一 ... [详细]
  • C#DataGridView控件中数据导出到Excel方法一:usingSystem;usingSystem.Collections.Generic;usingSys ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
悲酥清风茶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有