要做一个定时器,要求精确到毫秒,要怎么做?用SetTimer()行吗?
如果哪位有例子那更好了。
如果哪位有例子那更好了。
解决方案 »
- MainFrm.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CXml_record::Res
- MFC新手求助啊!
- 基于对话框的应用程序如何获取入口参数?谢谢.
- CSliderCtr 中的Sld.SetPageSize(?);怎么设置小数(非整数)的步长?
- include麻烦的问题
- 工作搞定,人生面临新的机遇和挑战。。。。。。
- 三个问题,每题30分!
- 关于文件读取,应该有代表性的说
- [新人求解]利用下载函数实现文件列表下载
- mfc的tab控件的标签页如何单独设置背景色
- 关于CString的问题
- 如何关闭office文档,并保存它们。
{
m_nTimer = SetTimer(1, 2000, 0);
}void CMyDlg::OnStopTimer()
{
KillTimer(m_nTimer);
}void CMyDlg::OnTimer(UINT nIDEvent)
{
MessageBeep(0xFFFFFFFF); // Beep // Call base class handler.
CDialog::OnTimer(nIDEvent);
}那个2000就是事件,毫秒,你可以现在就是2000毫秒你可以用class wizard找到响应wm_timer的OnTimer函数
unsigned short _inpw( unsigned short port );
unsigned long _inpd( unsigned short port );
向端口地址写数据或命令字的三个函数原型分别如下:
int _outp( unsigned short port, int databyte );
unsigned short _outpw( unsigned short port,
unsigned short dataword );
unsigned long _outpd( unsigned short port,
unsigned long dataword );---- 举例来说,对端口地址0xAddress写入字节数据0xData是_outp(0xAddress,0xData),而若从该地址读取字节数据,则用_inp(0xAddress)。第5节将以一实例介绍硬件操作的全过程。
3 Visual C++多媒体定时器的编程实现 ---- 3.1设定Windows 95多媒体定时器[1][2] ---- 多媒体定时器可直接用Component Gallery在项目中插入Windows Multimedia组件,此时多媒体定时器所需的头文件和库将自动插入工程的Stdafx.h中,或用手直接将以下语句添入Stdafx.h,即: #include <MMSystem.h>
// CG: The following line was added
by the Windows Multimedia component.
#pragma comment(lib, "winmm.lib")---- 3.2 多媒体定时器的应用 1)定义定时器参数
#define TEN_MILLI_SECOND 200 //定时器间隔
#define TIMER_ACCURACY 1//定时器精度
UINTTimer_ID;//定时器句柄
UINTwAccuracy; //定时器精度参数
2)通过多媒体定时器设备函数
timeGetDeviceCaps获得本微机的最大分辨率。
TIMECAPS tc; //定时器分辨率的结构
If(timeGetDeviceCaps(&tc,sizeof(TIMECAPS))
= = TIMERR_NOERROR)
{
//获得本系统的最小定时器分辨率,
所有应用必须大于等于该分辨率
wAccuracy=min(max(tc.wPeriodMin,
TIMER_ACCURACY),tc.wPeriodMax);
//设定本应用的所需的定时器分辨率,
本例为微机的所允许的最大分辨率
timeBeginPeriod(wAccuracy);
}
3)应用多媒体定时器的timeSetEvent函
数设定事件的触发方式,它的函数原形是:
MMRESULT timeSetEvent( UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
DWORD dwUser, UINT fuEvent);
uDelay用于设定事件触发间隔;
uResolution用于设定程序所需的最小分辨率;
lpTimeProc 调用回调函数;
dwUser 用户提供的回调数据;
fuEvent 事件触发方式,
在Visual C++中有两种方式:
TIME_ONESHOT:事件仅触发一次
TIME_PERIODIC:每隔一定时间触发一次
TimeSetEvent函数返回定时器句柄,
具体应用是:
Timer_ID=timeSetEvent
(TEN_MILLI_SECOND,wAccuracy,
( LPTIMECALLBACK)CatchMMTimer,
(DWORD)hWnd,TIME_PERIODIC);
4)声明一个全局的回调(Callback)函数
void CALLBACK TwoHundredMilliSecondProc
(UINT wTimerID,UINT nMsg,DWORD
dwUser,DWORD dw1,DWORD dw2),---- 在回调函数中调用事件触发消息且在回调函数中语句尽量简单,不要在回调函数内做一些耗时的操作;
---- 5)添加用户消息CatchMMTimer函数,用来接收多媒体定时器的事件通知。其过程是首先在类的头文件定义:#define MYMSG_TIMER WM_USER+101,然后在类头文件的AFX_MSG块中说明消息处理函数:afx_msg LRESULT OnMymsgTimer(WPARAM wParam, LPARAM lParam); 在类实现的消息映射块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中:ON_MESSAGE (MYMSG_TIMER, OnMymsgTimer)。最后在相应类中实现消息处理函数。关于用户自定义消息具体可参考Visual C++ s书籍。如:PostMessage((HWND)dwUser,MYMSG_TIMER,0,0); //PostMessage发送消息 ---- 6)定时器的任务完成后,要及时删除,否则占用太多内存,系统会越来越慢。删除定时器分两步,首先调用timeKillEvent函数删除定时器句柄,然后用timeEndPeriod函数删除定时器的分辨率。具体应用如下: ---- timeKillEvent(Timer_ID);
---- timeEndPeriod(wAccuracy); ---- 本节所用所有函数的使用可参阅Visual C++提供的在线帮助。
多媒体定时器 的 应 用