一、介绍
对应时间函数,c语言有标准库,但是要一直阻塞读取,这里介绍一种类似中断的处理方法,设置时间,时间到以后直接跳转到自己设定的函数里面执行,执行完以后返回当之前 的代码
使用这个可以
这里使用的ide:DEV C++
二、函数介绍
1、创建回调
MMRESULT timeSetEvent(
UINT uDelay,
UINT uResolution,
LPTIMECALLBACK fptc,
DWORD dwUser,
UINT fuEvent
);
uDelay:以毫秒指定事件的周期。
uResolution :以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
fptc :指向一个回调函数。
dwUser :存放用户提供的回调数据。
fuEvent :指定定时器事件类型:
TIME_ONESHOT:uDelay毫秒后只产生一次
TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件
2、回调函数
除了函数格式其他的自己写
void WINAPI timerfun(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
//需要执行的操作
}
3、注销回调
MMRESULT timeKillEvent(UINT uTimerID) ;
uTimerID:事件的ID号
三、使用方法
1、添加库"WinMM.Lib"
下载链接
http://www.opdown.com/soft/125224.html#download
注意:一定设置成32位编译,找了好久的问题,最后就是64位不支持
2、添加头文件和和参数
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
#pragma comment (lib, "WinMM.lib")
3、编写回调函数
void WINAPI time_callback(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
printf("callback hello guoguo\n");
}
4、创建事件
MMRESULT timer_id = timeSetEvent(
1000, // 以毫秒指定事件的周期
1, // 精度, 默认1ms
&time_callback, // 回调函数地址
(DWORD)1, // 存放用户提供的回调数据
TIME_PERIODIC); // TIME_ONESHOT -- 执行一次; TIME_PERIODIC -- 周期性执行;
if(timer_id != 0)
{
printf("create timer ok\n");
printf("timer id %d\n", timer_id);
}
else
{
printf("create timer fail\n");
return -1;
}
四、完整代码
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
#pragma comment (lib, "WinMM.lib")
//#pragma comment (lib, "WinMM")
void WINAPI time_callback(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
printf("callback hello guoguo\n");
}
int main()
{
MMRESULT timer_id = timeSetEvent(
1000, // 以毫秒指定事件的周期
1, // 精度, 默认1ms
&time_callback, // 回调函数地址
(DWORD)1, // 存放用户提供的回调数据
TIME_PERIODIC); // TIME_ONESHOT -- 执行一次; TIME_PERIODIC -- 周期性执行;
if(timer_id != 0)
{
printf("create timer ok\n");
printf("timer id %d\n", timer_id);
}
else
{
printf("create timer fail\n");
return -1;
}
while(1);
timeKillEvent(timer_id);
return 0;
}
五、结果