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

 更新时间:2014年04月14日 07:39:23   作者:  
这篇文章主要介绍了vc6.0中c语言控制台程序中的定时技术(定时器),需要的朋友可以参考下

打开main.c编译运行,注意,打开main.c之后一定要将win32timer.c也加进工程中一起编译,下面有图。
在开发单片机、ARM以及Linux系统的程序时,因为硬件定时中断的存在我们很方便构造出定时ISR,然而在VC6.0中,我们如何写一个定时程序呢?
其实,就是timeSetEvent()这个函数的调用。这个函数的解释见MSDN。详细原理,请看我代码中的注释,我写得很详细了。

main.c

复制代码 代码如下:

//======================
// main.c
//======================
#include <stdio.h>
#include "win32timer.h"  // UserTimerSet(uDelay,UserFun)

int cnt = 0;

void myISR_Called_Per_1000ms(void);

int main(void)
{
 /* 每1000ms调用一次myISR_Called_Per_1000ms */
 UserTimerSet ( 1000, myISR_Called_Per_1000ms ) ;

 while (cnt<10);

 return 0; 
}

void myISR_Called_Per_1000ms(void)

 printf("The Program has run %ds\n",cnt++);
}

win32timer.h

复制代码 代码如下:

/*
 * 使用说明:
 *
 *     1. 用户程序需要 #include "win32timer.h" ;
 *     2. 用户需要将 win32timer.c 添加至根目录,或添加至工程;
 *    3. 用户程序直接调用UserTimerSet(uDelay,UserFun); 即可,
 *        其中,uDelay为定时调用的定时周期,单位为毫秒(ms),
 *        UserFun为用户被调函数void ISR(void)的函数名ISR。
 *     4. 可以同时使用多个timeSetEvent,每个timeSetEvent都可以
 *        返回定时器编号,详细见MSDN关于timeSetEvent的说明。
 */


//=======================
// win32timer.h
//=======================
#ifndef __WIN32TIMER_H__
#define __WIN32TIMER_H__

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

#endif  // @ #ifndef __WIN32TIMER_H__

win32timer.c

复制代码 代码如下:

//=======================
// win32timer.c
//=======================

#include <windows.h>
#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); //模拟中断返回,主线程得以继续执行
}



工程图

运行结果

相关文章

  • C++ 之 Asio 库(全面解析)

    C++ 之 Asio 库(全面解析)

    下面小编就为大家带来一篇C++ 之 Asio 库(全面解析)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C语言实现小小圣诞树源代码

    C语言实现小小圣诞树源代码

    圣诞节当然要有个圣诞树了,今天给你们用C语言编写一个雪夜圣诞树,这篇文章主要给大家介绍了关于C语言实现小小圣诞树的相关资料,需要的朋友可以参考下
    2023-12-12
  • C语言strcat函数详解:字符串追加的利器

    C语言strcat函数详解:字符串追加的利器

    strcat函数用于将源字符串追加到目标字符串的末尾,并返回一个指向目标字符串的指针,它可以实现字符串的拼接操作
    2024-08-08
  • C++ 动态数组模版类Vector实例详解

    C++ 动态数组模版类Vector实例详解

    这篇文章主要为大家详细介绍了C++动态数组模版类Vector实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • c语言结构体字节对齐的实现方法

    c语言结构体字节对齐的实现方法

    在c语言的结构体里面一般会按照某种规则去进行字节对齐。本文就来介绍一下如何实现,具有一定的参考价值,感兴趣的可以了解下
    2021-07-07
  • C++中String类的常用接口函数总结

    C++中String类的常用接口函数总结

    这篇文章主要介绍了C++中Stirng类的常用接口函数,文中有详细的代码示例供大家参考,对我们学习C++有一定的帮助,感兴趣的同学可以跟着小编一起来学习
    2023-06-06
  • C语言版扫雷小游戏

    C语言版扫雷小游戏

    这篇文章主要为大家详细介绍了C语言版的扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言小程序 如何判断两个日期之差

    C语言小程序 如何判断两个日期之差

    输入两个日期,计算之间相差多少天。 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样
    2013-07-07
  • C++ 指向类成员的指针

    C++ 指向类成员的指针

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)
    2020-03-03
  • QT树的具体项目实现

    QT树的具体项目实现

    本文主要介绍了QT树的具体项目实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论