c语言定时器作用,vc6.0中c语言控制台程序中的定时技术(定时器)

//=======================

// win32timer.c

//=======================

#include 

#include "win32timer.h"

#pragma comment(lib,"winmm.lib") //导入winmm.lib多媒体库

/* 全局变量 */

HANDLE mainhandle;     //主线程句柄

CONTEXT Context;     //主线程切换上下文

static void (*TimerCallFun)(void);  //声明用户调用函数指针

/* 函数声明 */

static void __stdcall TimerISR(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2);

//======================================================================================

// 函数功能:用户需要调用的定时器设置(初始化)函数

// 入口参数:uDelay:定时器定时时长,单位为ms

//     void (*UserFun)(void):指向用户函数 void fun (void) 的函数指针

// 返 回 值:无

//======================================================================================

void UserTimerSet ( unsigned int uDelay, void (*UserFun)(void) )

{

HANDLE cp,ct;

TimerCallFun = UserFun;     //得到用户被定时调用的函数的函数指针

Context.ContextFlags = CONTEXT_CONTROL;

cp = GetCurrentProcess(); //得到当前进程句柄

ct = GetCurrentThread(); //得到当前线程伪句柄

DuplicateHandle( cp, ct, cp, &mainhandle, 0, TRUE, 2 ); //伪句柄转换,得到线程真句柄

/*模拟设置定时器中断,开启一个定时器线程*/

timeSetEvent( uDelay, 0, TimerISR, 0, TIME_PERIODIC );

/*如果需要取消定时器,则可以调用timeKillEvent()函数,详见MSDN*/

}

//======================================================================================

// 函数功能:timeSetEvent需要定时调用的函数

// 入口参数:unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2,详见MSDN

// 返 回 值:无

//======================================================================================

static void __stdcall TimerISR(unsigned int uTimerID, unsigned int uMsg, unsigned long dwUser, unsigned long dw1, unsigned long dw2)

{

SuspendThread(mainhandle); //中止主线程的运行,模拟中断产生.但没有保存寄存器

GetThreadContext(mainhandle, &Context); //得到主线程上下文,为切换任务做准备

//===========================================================================================

(*TimerCallFun)();    //或者TimerCallFun(); ———— 用户自定义实现的中断调用

//===========================================================================================

ResumeThread(mainhandle); //模拟中断返回,主线程得以继续执行

}

01-22 2939
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值