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

工程图

运行结果

(0)

相关推荐

  • c语言定时器示例分享

    在linux下开发,使用的是C语言.适用于需要定时的软件开发,以系统真实的时间来计算,它送出SIGALRM信号.每隔一秒定时一次 c语言定时器 复制代码 代码如下: #include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include <ctype.h>#include <stdio.

  • C语言编写简单的定时关机程序

    写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机. 这里主要考察system()命令. 代码实现: #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char cmd[20]="shutdown -s -t "; char t[5]="0"; int c; system("title C语言关机程序")

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

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

  • 在.NET Core控制台程序中如何使用依赖注入详解

    背景介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之间.类与类之间都是通过new一个对方的实例进行相互调用,这样在开发过程中有一个好处,可以清晰的知道在使用哪个具体的实现.随着软件体积越来越庞大,逻辑越来越复杂,当需要更换实现方式,或者依赖第三方系统的某些接口时,这种相互之间持有具体实现的方式不再合适.为了应对这种情况,就要采用契约式编程:相互之间依赖于规定好的契约(接口),不依赖于具体的实现.这样带来的好处是相互之间的依赖变得非常简单,又称松

  • C#控制台程序中使用官方依赖注入的实现

    asp.net core 中已经自带了一个官方的依赖注入框架,现在想把它应用到控制台程序中,控制台程序是最简洁的代码结构,摒除了其他一堆嵌入的框架代码,只包含最简洁的入口函数,是学习基础类库框架的最佳选择,为什么最佳,原因很简单,没有其他项的干扰,Demo效果清晰明了,方便写测试代码,调试也顺畅. 1. 业务接口类设计编写 先要写一个测试用的接口和类,我写了一个很简单的计算求和的接口类和方法,方便待会注入演示效果. 我设计的演示接口很简单,IBaseService 基础接口负责生成一个随机的数字

  • VC6.0打开文件以及向工程中添加文件时程序崩溃自动退出解决方法

    换了一台电脑,vc6.0程序中,点击打开文件以及向工程中添加文件时,程序竟然崩溃自动退出了. 不知什么原因,安装相同的vc程序,本本竟然出现此缘故.但是这个操作又是自己经常用到的,所以不得不解决. 与上一台电脑不同的是,此电脑是win7系统,而上一个则是xp系统.此电脑office是2010版本,而上一个则是WPS:于是乎,在网上查资料,来解决. 看到网上也有类似的问题,有的说是win7系统原因,有的说是office2007版本缘故,有的说是viso缘故.总之,这几种说法,我都符合.win7系统

  • 使用VC6.0对C语言程序进行调试的基本手段分享

    (1)设置固定断点或临时断点 所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况.这些情况一般包括: ①在变量窗口(Varibles)中观察程序中变量的当前值.程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围.例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414. 复制代码 代码如下: #include <stdio.h>#includ

  • 易语言控制台程序调用窗口的组件详解

    最近有小伙伴问我,易语言的模块或者控制台程序怎么调用窗口的组件,现在我发经验,喜欢的关注哦,给大家解决了,大神不要喷 其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦.其实易语言里面的那些按钮啊编辑框啊都是类,什么是类自己百度,不啰嗦. 而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型而在窗口显示的其实是类实体化,有可视类(可以看见.点击等)的属性类型 向文本型啊,整数型啊都是一个类型,不过是原生的支持库的,科普完成向文本型啊,整数型啊都是一个类型,不过是原

  • C#控制台程序中处理2个关闭事件的代码实例

    应用场景 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用户直接关闭.如果我们不希望用户通过Ctrl+C终止我们的程序,就需要对Ctrl+C或关闭事件作处理. 处理方法 在.net平台下Console类有个CancelKeyPress事件可以处理Ctrl+C,不过对于直接关闭控制台应用,这种处理就无能为力了. 不过Windows API中有个SetConsoleCtrlHandler函数可以处理这两种关闭事件. C#处理代码如下: 复制代码 代码如下: static cla

  • 在VC中隐藏控制台程序窗口的实现代码

    下面就介绍一下,如何隐藏win32 console application的console窗口因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译器的链接开关选项(也就是linker选项).首先我们来看一下linker的 /subsystem 选项该选项的语法形式如下: /subsystem:{console|efi_application|efi_boot_service_driver|efi_rom|efi_runtime_driver|native|posix|window

  • 在WinForm应用程序中快速实现多语言的处理的方法

    在国际化环境下,越来越多的程序需要做多语言版本,以适应各种业务需求的变化.在Winform应用程序中实现多语言也有常规的处理方式处理,不过需要针对每个语言版本,重新修改Winform界面的显示,对一些常规的辅助类,也需要引入一个统一的资源管理类来处理多语言的问题,相对比较繁琐.本篇随笔针对多语言的需求,希望尽量避免繁琐的操作,既能符合本地语种开发人员的开发习惯,又能快速实现Winform程序的多语言场景处理. 1.多语言开发的困惑和思路 在常规的多语言版本程序中,开发总是伴随着很多不愉快的事情,

  • VC中控制台程序创建窗口的实例方法

    在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像 #include "windows.h" #include "TCHAR.h" //声明自定义消息处理函数 LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hInstan

随机推荐