#include?stdio.h
邕寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
void?delay(unsigned?long?n)?{//延時(shí)時(shí)間與n有關(guān)系,業(yè)余你的電腦的運(yùn)行速度有關(guān),至于延時(shí)是否有5秒,請(qǐng)自行調(diào)整
unsigned?long?i,j,k,m?=?n;
for(i?=?0;?i??n;?++i)
for(j?=?0;j??n;?++j)
for(k?=?0;j??n;?++i)
while(m--);
}
void?fun()?{}
int?main()?{
unsigned?n?=?50000;
while(1)?{
fun();
delay(n);//延時(shí)
}
return?0;
}
Windows提供了定時(shí)器,幫助我們編寫定期發(fā)送消息的程序。定時(shí)器一般通過(guò)一下兩中方式通知應(yīng)用程序間隔時(shí)間已到。
⑴ 給指定窗口發(fā)送WM_TIMER消息,也就是下面的給出在窗口類中使用的方法。
⑵ 調(diào)用一個(gè)應(yīng)用程序定義的回調(diào)函數(shù),也就是在非窗口類中使用方法。
4.1 在窗口類中使用定時(shí)器
在窗口類中使用定時(shí)器比較簡(jiǎn)單。假如我們想讓這個(gè)窗口上放置一個(gè)電子鐘,這樣我們必須每1秒或者0.5秒鐘去更新顯示顯見(jiàn)。按照下面的步驟,就可以完成這個(gè)電子鐘程序,并且知道如何在窗口類中使用定時(shí)器:
首先做在我們新建項(xiàng)目的主窗口上添加一個(gè)Label控件,用來(lái)顯示時(shí)間。接著
⑴ 用函數(shù)SetTimer設(shè)置一個(gè)定時(shí)器,函數(shù)格式如下: UINT SetTimer( UINT nIDEvent,
UINT nElapse,
void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD));
這個(gè)函數(shù)是CWnd類的一個(gè)成員函數(shù),其參數(shù)意義如下:
nIDEvent: 為設(shè)定的定時(shí)器指定的定時(shí)器標(biāo)志值,設(shè)置多個(gè)定時(shí)器的時(shí)候,每個(gè)定時(shí)器的值都不同,消息處理函數(shù)就是通過(guò)這個(gè)參數(shù)來(lái)判斷是哪個(gè)定時(shí)器的。這里我們?cè)O(shè)定為1。
nElapse: 指定發(fā)送消息的時(shí)間間隔,單位是毫秒。這里我們?cè)O(shè)定為1000,也就是一秒。
lpfnTimer: 指定定時(shí)器消息由哪個(gè)回調(diào)函數(shù)來(lái)執(zhí)行,如果為空,WM_TIMER將加入到應(yīng)用程序的消息隊(duì)列中,并由CWnd類來(lái)處理。這里我們?cè)O(shè)定為NULL。
最后代碼如下:SetTimer(1,1000,NULL);
⑵ 通過(guò)Class Wizard給主窗口類添加一個(gè)WM_TIMER消息的映射函數(shù),默認(rèn)為OnTimer(UINT nIDEvent)。
⑶ 然后我們就可以在OnTimer(UINT nIDEvent)的函數(shù)實(shí)現(xiàn)中添加我們的代碼了。參數(shù)nIDEvent就是我們先前設(shè)定定時(shí)器時(shí)指定的標(biāo)志值,在這里我們就可以通過(guò)它來(lái)區(qū)別不同的定時(shí)器,而作出不同的處理。添加的代碼如下:switch(nIDEvent)
{
case 1:
CTime m_SysTime = CTime::GetCurrentTime();
SetDlgItemText(IDC_STATIC_TIME,m_SysTime.Format("%Y年%m月%d日 %H:%M:%S"));
break;
}
代碼中的IDC_STATIC_TIME就是我們先前添加的Label控件的ID。
至此,我們的電子鐘的程序就完成了。
4.2 在非窗口類中使用定時(shí)器
在非窗口類中使用定時(shí)器就要用到前面我們介紹到的所有知識(shí)了。因?yàn)槭菬o(wú)窗口類,所以我們不能使用在窗口類中用消息映射的方法來(lái)設(shè)置定時(shí)器,這時(shí)候就必須要用到回調(diào)函數(shù)。又因?yàn)榛卣{(diào)函數(shù)是具有一定格式的,它的參數(shù)不能由我們自己來(lái)決定,所以我們沒(méi)辦法利用參數(shù)將this傳遞進(jìn)去??墒庆o態(tài)成員函數(shù)是可以訪問(wèn)靜態(tài)成員變量的,因此我們可以把this保存在一個(gè)靜態(tài)成員變量中,在靜態(tài)成員函數(shù)中就可以使用該指針,對(duì)于只有一個(gè)實(shí)例的指針,這種方法還是行的通的,由于在一個(gè)類中該靜態(tài)成員變量只有一個(gè)拷貝,對(duì)于有多個(gè)實(shí)例的類,我們就不能用區(qū)分了。解決的辦法就是把定時(shí)器標(biāo)志值作為關(guān)鍵字,類實(shí)例的指針作為項(xiàng),保存在一個(gè)靜態(tài)映射表中,因?yàn)槭菢?biāo)志值是唯一的,用它就可以快速檢索出映射表中對(duì)應(yīng)的該實(shí)例的指針,因?yàn)槭庆o態(tài)的,所以回調(diào)函數(shù)是可以訪問(wèn)他們的。
首先介紹一下用于設(shè)置定時(shí)的函數(shù):
UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
其中的參數(shù)意義如下:
hWnd: 指定與定時(shí)器相關(guān)聯(lián)的窗口的句柄。這里我們?cè)O(shè)為NULL。
nIDEvent: 定時(shí)器標(biāo)志值,如果hWnd參數(shù)為NULL,它將會(huì)被跳過(guò),所以我們也設(shè)定為NULL。
uElapse: 指定發(fā)送消息的時(shí)間間隔,單位是毫秒。這里我們不指定,用參數(shù)傳入。
lpTimerFunc: 指定當(dāng)間隔時(shí)間到的時(shí)候被統(tǒng)治的函數(shù)的地址,也就是這里的回調(diào)函數(shù)。這個(gè)函數(shù)的格式必須為以下格式:
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
其中的參數(shù)意義如下:
hwnd: 與定時(shí)器相關(guān)聯(lián)的窗口的句柄。
uMsg: WM_TIMER消息。
idEvent: 定時(shí)器標(biāo)志值。
deTime: 系統(tǒng)啟動(dòng)后所以經(jīng)過(guò)的時(shí)間,單位毫秒。
最后設(shè)定定時(shí)器的代碼為:m_nTimerID = SetTimer(NULL,NULL,nElapse,MyTimerProc);
先通過(guò)Class Wizard創(chuàng)建一個(gè)非窗口類,選擇Generic Class類類型,類名稱為CMyTimer,該類的作用是每隔一段時(shí)間提醒我們做某件事情,然后用這個(gè)類創(chuàng)建三個(gè)實(shí)例,每個(gè)實(shí)例以不同的時(shí)間間隔提醒我們做不同的事情。
MyTimer.h#include
class CMyTimer;
//用模板類中的映射表類定義一種數(shù)據(jù)類型
typedef CMap CTimerMap;
class CMyTimer
{
public:
//設(shè)置定時(shí)器,nElapse表示時(shí)間間隔,sz表示要提示的內(nèi)容
void SetMyTimer(UINT nElapse,CString sz);
//銷毀該實(shí)例的定時(shí)器
void KillMyTimer();
//保存該實(shí)例的定時(shí)器標(biāo)志值
UINT m_nTimerID;
//靜態(tài)數(shù)據(jù)成員要提示的內(nèi)容
CString szContent;
//聲明靜態(tài)數(shù)據(jù)成員,映射表類,用于保存所有的定時(shí)器信息
static CTimerMap m_sTimeMap;
//靜態(tài)成員函數(shù),用于處理定時(shí)器的消息
static void CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
CMyTimer();
virtual ~CMyTimer();
};
MyTimer.cpp#include "stdafx.h"
#include "MyTimer.h"
//必須要在外部定義一下靜態(tài)數(shù)據(jù)成員
CTimerMap CMyTimer::m_sTimeMap;
CMyTimer::CMyTimer()
{
m_nTimerID = 0;
}
CMyTimer::~CMyTimer()
{
}
void CALLBACK CMyTimer::MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
CString sz;
sz.Format("%d號(hào)定時(shí)器:%s",
idEvent,
m_sTimeMap[idEvent]-szContent);
AfxMessageBox(sz);
}
void CMyTimer::SetMyTimer(UINT nElapse,CString sz)
{
szContent = sz;
m_nTimerID = SetTimer(NULL,NULL,nElapse,MyTimerProc);
m_sTimeMap[m_nTimerID] = this;
}
void CMyTimer::KillMyTimer()
{
KillTimer(NULL,m_nTimerID);
m_sTimeMap.RemoveKey(m_nTimerID);
}
這樣就完成了在非窗口類中使用定時(shí)器的方法。以上這些代碼都在Windwos 2000 Professional 和 Visual C++ 6.0中編譯通過(guò)。
單片機(jī)中通過(guò)中斷的方式來(lái)調(diào)用定時(shí)器。
具體的調(diào)用方式可以參考通過(guò)如下程序:
程序功能:利用定時(shí)器進(jìn)行定時(shí),實(shí)現(xiàn)每秒中l(wèi)ed閃爍一次
#includereg52.h
sbit?led?=?P0^0;
unsigned?int?num;
void?main(void)
{
TMOD?=?0x00;???//?工作方式0
TH0?=?(8192?-?5000)?/?32;??//?12M晶振下定時(shí)5ms
TL0?=?(8192?-?5000)?%?32;
EA?=?1; ???//?開(kāi)總中斷
ET0?=?1; ???//?開(kāi)定時(shí)器中斷
TR0?=?1; ???//?啟動(dòng)定時(shí)器
while(1)
{
? if(num?==?200) ??//?定時(shí)1秒鐘到
{
num?=?0; ??//?計(jì)數(shù)器清零
led?=?~led; ??//?led燈取反,實(shí)現(xiàn)1秒閃爍一次
}
}
}
void?timer()?interrupt?1??//?定時(shí)器1工作與方式0
{
TH0?=?(8192?-?5000)?/?32;??//?重裝初值
TL0?=?(8192?-?5000)?%?32;
num++; ?//?計(jì)數(shù)器加1
}
Timer()函數(shù)
語(yǔ)法:Timer ( interval {, windowname } )
參數(shù):指定兩次觸發(fā)Timer事件之間的時(shí)間間隔,有效值在0到65之間。如果該參數(shù)的值指定為0,那么關(guān)閉定時(shí)器,不再觸發(fā)指定窗口的Timer事件。windowname:窗口名,指定時(shí)間間隔到時(shí)要觸發(fā)哪個(gè)窗口的Timer事件。省略該參數(shù)時(shí),觸發(fā)當(dāng)前窗口的Timer事件返回值Integer。函數(shù)執(zhí)行成功時(shí)返回1,發(fā)生錯(cuò)誤時(shí)返回-1。如果任何參數(shù)的值為NULL,Timer()函數(shù)返回NULL。用法使用Timer()函數(shù)可以周期性地觸發(fā)指定窗口的Timer事件,這樣,每當(dāng)時(shí)間間隔過(guò)去時(shí),應(yīng)用程序都可以完成一些周期性的工作,比如繪制簡(jiǎn)單動(dòng)畫等。將Timer()的interval參數(shù)設(shè)置為非0值時(shí)啟動(dòng)定時(shí)器并開(kāi)始計(jì)時(shí);將該函數(shù)的interval參數(shù)設(shè)置為0時(shí)關(guān)閉定時(shí)器,終止計(jì)時(shí)任務(wù)。需要注意的是,在Microsoft Windows系統(tǒng)中,該函數(shù)能夠計(jì)時(shí)的最小時(shí)間間隔為0.055秒(約1/18秒),如果把interval參數(shù)的值設(shè)置小于0.055,那么該定時(shí)器將每隔0.055秒觸發(fā)一次窗口的Timer事件。Microsoft Windows 3.x最多只支持系統(tǒng)中同時(shí)啟動(dòng)16個(gè)定時(shí)器。
用法:
啟動(dòng)定時(shí)器。
啟動(dòng)定時(shí)器就需要使用CWnd類的成員函數(shù)SetTimer。CWnd::SetTimer的原型如下:
UINT_PTR SetTimer(
UINT_PTR nIDEvent,
UINT nElapse,
void (CALLBACK* lpfnTimer)(
HWND,
UINT,
UINT_PTR,
DWORD
)
);
參數(shù)nIDEvent指定一個(gè)非零的定時(shí)器ID;參數(shù)nElapse指定間隔時(shí)間,單位為毫秒;參數(shù)lpfnTimer指定一個(gè)回調(diào)函數(shù)的地址,如果該參數(shù)為NULL,則WM_TIMER消息被發(fā)送到應(yīng)用程序的消息隊(duì)列,并被CWnd對(duì)象處理。如果此函數(shù)成功則返回一個(gè)新的定時(shí)器的ID,我們可以使用此ID通過(guò)KillTimer成員函數(shù)來(lái)銷毀該定時(shí)器,如果函數(shù)失敗則返回0。
通過(guò)SetTimer成員函數(shù)我們可以看出,處理定時(shí)事件可以有兩種方式,一種是通過(guò)WM_TIMER消息的消息響應(yīng)函數(shù),一種是通過(guò)回調(diào)函數(shù)。
如果要啟動(dòng)多個(gè)定時(shí)器就多次調(diào)用SetTimer成員函數(shù)。另外,在不同的CWnd中可以有ID相同的定時(shí)器,并不沖突。
time函數(shù)
返回某一特定時(shí)間的小數(shù)值。如果在輸入函數(shù)前,單元格的格式為“常規(guī)”,則結(jié)果將設(shè)為日期格式。
函數(shù) TIME 返回的小數(shù)值為 0(零)到 0.99999999 之間的數(shù)值,代表從 0:00:00 (12:00:00 AM) 到 23:59:59 (11:59:59 P.M.) 之間的時(shí)間。
語(yǔ)法:
TIME(hour, minute, second)
TIME 函數(shù)語(yǔ)法具有以下參數(shù):
Hour 必需。0(零)到 32767 之間的數(shù)值,代表小時(shí)。任何大于 23 的數(shù)值將除以 24,其余數(shù)將視為小時(shí)。例如,TIME(27,0,0) = TIME(3,0,0) = .125 或 3:00 AM。
Minute 必需。0 到 32767 之間的數(shù)值,代表分鐘。任何大于 59 的數(shù)值將被轉(zhuǎn)換為小時(shí)和分鐘。例如,TIME(0,750,0) = TIME(12,30,0) = .520833 或 12:30 PM。
Second 必需。0 到 32767 之間的數(shù)值,代表秒。任何大于 59 的數(shù)值將被轉(zhuǎn)換為小時(shí)、分鐘和秒。例如,TIME(0,0,2000) = TIME(0,33,22) = .023148 或 12:33:20 AM。
例子:
?php$t=time();echo($t . "br /");echo(date("D F d Y",$t));?
輸出:
1138618081Mon January 30 2006
啟動(dòng)定時(shí)器,程序可用讀取其計(jì)數(shù),或者用定時(shí)器觸發(fā)中斷,在中斷中自己用變量計(jì)數(shù),這樣就有了一個(gè)時(shí)間計(jì)數(shù)值了。再有就是利用RTC也行。
在調(diào)用子程序前讀取時(shí)間計(jì)數(shù)值,調(diào)用完畢再讀取計(jì)數(shù)值,通過(guò)計(jì)算兩個(gè)計(jì)數(shù)值的差可計(jì)數(shù)調(diào)用時(shí)間。
如果嫌麻煩,可用利用GPIO,在調(diào)用之前設(shè)置GPIO為高,調(diào)用完成設(shè)置為低,反復(fù)調(diào)用,用示波器測(cè)量GPIO正脈寬,可計(jì)算時(shí)長(zhǎng)。
標(biāo)題名稱:調(diào)用定時(shí)器子函數(shù)c語(yǔ)言 c++定時(shí)器函數(shù)
標(biāo)題路徑:http://muchs.cn/article28/hjdocp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信小程序、域名注冊(cè)、云服務(wù)器、App設(shè)計(jì)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)