a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

vc6.0中c語言控制臺程序中的定時技術(定時器)

2020-01-26 15:32:31
字體:
來源:轉載
供稿:網友

打開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); //模擬中斷返回,主線程得以繼續執行
}



工程圖

運行結果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 欧美一区二区视频 | 国产亚洲成av人片在线观看 | 日韩欧美精品在线 | 亚洲欧美视频 | 91精品国产色综合久久不卡蜜臀 | cao视频| 国产午夜精品久久久久久久 | 国产午夜久久 | 国产日产精品一区二区三区四区 | 久久国产精品99久久久久久老狼 | 裸体在线国模精品偷拍 | 91精品国产综合久久久久久丝袜 | 国产中文字幕在线观看 | 日韩中文字| 欧美亚洲一区二区三区 | 国产精品国色综合久久 | 国产精品中文字幕在线播放 | 精品福利一区二区 | 91精品一区二区三区久久久久久 | 日韩在线播放一区 | 亚洲97视频 | 久久精品一区二区 | 欧洲成人午夜免费大片 | 欧美在线 | 亚洲日本伊人 | 精品一二三区 | 午夜资源 | 久草网站| 99热在线播放 | 99re视频| 99久久精品一区二区 | 色婷婷综合国产精品一区 | 国产精品久久嫩一区二区免费 | 少妇一级淫片免费放 | 国产在线精品一区二区三区 | 日韩精品久 | 九九资源站| 亚洲成人在线观看视频 | 国产精品久久精品久久 | 国产精品精品视频一区二区三区 | 日韩精品久久久 |