下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、利用delphi建立精確計數(shù)器在delphi中最常用的是timer控件,它的設(shè)置和使用都非常方便,理論上它的記時精度可以達到1ms(毫秒)。但是眾所周知的,實際上timer在記時間隔小于50ms之下是精度是十分差的。它只適用于對于精度要求不太高的場合。 這里作者要介紹的是兩種利用windows api函數(shù)實現(xiàn)精確記時的方法。第一中方法是利用高性能頻率記數(shù)(作者本人的稱呼)法。利用這種方法要使用兩個api函數(shù)queryperformancefrequency和queryperformancecounter。queryperformancefrequency函數(shù)獲得高性能頻率記數(shù)器的震蕩頻率。調(diào)用
2、該函數(shù)后,函數(shù)會將系統(tǒng)頻率記數(shù)器的震蕩頻率(每毫秒)保存到一個largeinteger中。不過利用該函數(shù)在幾臺機器上做過試驗,結(jié)果都是1193180。讀者朋友可以在自己的機器上試一下queryperformancecounter函數(shù)獲得系統(tǒng)頻率記數(shù)器的震蕩次數(shù),結(jié)果也保存到一個largenteger中。很顯然,如果在計時中首先使用queryperformancefrequency獲得高性能頻率記數(shù)器每毫秒的震蕩次數(shù),然后在計時開始時使用queryperformancecounter函數(shù)獲得當(dāng)前系統(tǒng)頻率記數(shù)器的震蕩次數(shù)。在計時結(jié)束時再調(diào)用queryperformancecounter函數(shù)獲得系統(tǒng)
3、頻率記數(shù)器的震蕩次數(shù)。將兩者相減,再將結(jié)果除以頻率記數(shù)器每毫秒的震蕩次數(shù),就可以獲得某一事件經(jīng)過的準(zhǔn)確時間。(次數(shù)除以頻率等于時間)另外的一種精確記時器的功能是利用多媒體記時器函數(shù)(這也是作者的定義,因為這個系列的函數(shù)是在winmm.dll中定義并且是為媒體播放服務(wù)的)。實現(xiàn)多媒體記時器首先要使用timesetevent函數(shù)建立計時事件。該函數(shù)在delphi中的mmsystem.pas中有定義,定義如下:function timesetevent(udelay, uresolution: uint; lpfunction: tfntimecallback; dwuser: dword; ufl
4、ags: uint): mmresult; stdcall函數(shù)定義中參數(shù)udelay定義延遲時間,以毫秒為單位,該參數(shù)相當(dāng)于timer控件的interval屬性。參數(shù)uresolution定義記時精度,如果要求盡可能高的精度,要將該參數(shù)設(shè)置為0;參數(shù)lpfunction定義了timesetevent函數(shù)的回調(diào)函數(shù)。該函數(shù)相當(dāng)于一個定時中斷處理函數(shù),每當(dāng)經(jīng)過一個udelay長度的時間間隔,該函數(shù)就會被調(diào)用,編程者可以在該函數(shù)中加入相應(yīng)的處理語句。參數(shù)dwuser定義用戶自定義的回調(diào)值,該值將傳遞給回調(diào)函數(shù)。參數(shù)uflags定義定時類型,如果要不間斷的記時,該值應(yīng)設(shè)置為1。如果函數(shù)調(diào)用成功,在系統(tǒng)
5、中建立了一個多媒體記時器對象,每當(dāng)經(jīng)過一個udelay時間后lpfunction指定的函數(shù)都會被調(diào)用。同時函數(shù)返回一個對象標(biāo)識,如果不再需要記時器則必須要使用timekillevent函數(shù)刪除記時器對象。由于windows是一個多任務(wù)的操作系統(tǒng),因此基于api調(diào)用的記時器的精度都會受到其它很多因素的干擾。到底這兩中記時器的精度如何,我們來使用以下的程序進行驗證:設(shè)置三種記時器(timer控件、高性能頻率記數(shù)、多媒體記時器)。將它們的定時間隔設(shè)置為10毫秒,讓它們不停工作直到達到一個比較長的時間(比如60秒),這樣記時器的誤差會被累計下來,然后同實際經(jīng)過的時間相比較,就可以得到它們的精度。下面是
6、具體的檢測程序。unit unit1;interfaceuses windows, messages, sysutils, classes, graphics, controls, forms, dialogs, stdctrls, extctrls,mmsystem;type tform1 = class(tform) edit1: tedit; edit2: tedit; edit3: tedit; button1: tbutton; button2: tbutton; timer1: ttimer; procedure formcreate(sender: tobject); proce
7、dure button1click(sender: tobject); procedure timer1timer(sender: tobject); procedure button2click(sender: tobject); private private declarations public public declarations end;var form1: tform1; acttime1,acttime2:cardinal; smmcount,stimercount,spcount:single; htimeid:integer; iten:integer; protimec
8、allback:tfntimecallback;procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;procedure proendcount;implementation$r *.dfm/timesetevent的回調(diào)函數(shù)procedure proendcount;begin acttime2:=gettickcount-acttime1; form1.button2.enabled :=false; form1.button1.enabled :=true; form1.timer1.e
9、nabled :=false; smmcount:=60; stimercount:=60; spcount:=-1; timekillevent(htimeid);end;procedure timeproc(utimerid, umessage: uint; dwuser, dw1, dw2: dword) stdcall;begin form1.edit2.text:=floattostr(smmcount); smmcount:=smmcount-0.01;end;procedure tform1.formcreate(sender: tobject);begin button1.ca
10、ption :='開始倒計時' button2.caption :='結(jié)束倒計時' button2.enabled :=false; button1.enabled :=true; timer1.enabled :=false; smmcount:=60; stimercount:=60; spcount:=60;end; procedure tform1.button1click(sender: tobject);var lgtick1,lgtick2,lgper:tlargeinteger; ftemp:single;begin button2.enable
11、d :=true; button1.enabled :=false; timer1.enabled :=true; erval :=10; protimecallback:=timeproc; htimeid:=timesetevent(10,0,protimecallback,1,1); acttime1:=gettickcount; /獲得系統(tǒng)的高性能頻率計數(shù)器在一毫秒內(nèi)的震動次數(shù) queryperformancefrequency(lgper); ftemp:=lgper/1000; iten:=trunc(ftemp*10); queryperformancecou
12、nter(lgtick1); lgtick2:=lgtick1; spcount:=60; while spcount>0 do begin queryperformancecounter(lgtick2); /如果時鐘震動次數(shù)超過10毫秒的次數(shù)則刷新edit3的顯示 if lgtick2 - lgtick1 > iten then begin lgtick1 := lgtick2; spcount := spcount - 0.01; edit3.text := floattostr(spcount); cessmessages; end; end;
13、end;procedure tform1.timer1timer(sender: tobject);begin edit1.text := floattostr(stimercount); stimercount:=stimercount-0.01;end;procedure tform1.button2click(sender: tobject);begin proendcount; /顯示從開始記數(shù)到記數(shù)實際經(jīng)過的時間 showmessage('實際經(jīng)過時間'+inttostr(acttime2)+'毫秒');end;end. 運行程序,點擊“開始倒記時”按
14、鈕,程序開始60秒倒記時,由于上面的程序只涉及了記時器程序的原理而沒有將錯誤處理加入其中,所以不要等60秒倒記時結(jié)束。點擊“結(jié)束倒記時”按鈕可以結(jié)束倒記時。這時在彈出對話框中會顯示實際經(jīng)過的時間(單位為毫秒),將三個文本框內(nèi)的時間乘以1000再加上實際經(jīng)過的時間,越接近60000,則記時精度越高。 從上面的結(jié)果看,由delphi的timer控件建立的記時器的精度十分差,無法在實際中使用,而利用高性能頻率記數(shù)法和多媒體計數(shù)器法的誤差都在1%以下??紤]到程序中在文本框中顯示時間對程序所造成的影響,這個誤差在應(yīng)用中是完全可以忽略的。另外在運行程序時作者還發(fā)現(xiàn)一個問題,如果在倒記時時拖動窗口,文本框中
15、的顯示都會停止,而當(dāng)停止窗口拖放后,多媒體記時器顯示會跳過這段時間記時,而其它兩種記時器顯示倒記時卻還是從原來的時間倒數(shù)。這說明多媒體記時器是在獨立的線程中運行的,不會受到程序的影響。綜合上面的介紹和范例,我們可以看到,如果要建立高精度的記時器,使用多媒體記時器是比較好的選擇。而高性能頻率記數(shù)法比較適合計算某個耗時十分短的過程所消耗的時間(例如分析程序中某個被多次調(diào)用的程序段執(zhí)行時間以優(yōu)化程序),因為畢竟高性能頻率記數(shù)的理論可以達到微秒級別。timer控件雖然精度比上面兩者差很多,但是它使用方便,在要求不高的場合它還是最佳選擇。下面為一些常用的日期處理函數(shù):var Da
16、teTime,MyDate,MyTime : TDateTime; DateStr,TimeStr:string;begin DateTime := Now; /返回當(dāng)前日期時間 DateStr:= DateToStr(DateTime); /轉(zhuǎn)換日期為字符串 ,
17、例如:01/08/96 TimeStr := TimeToStr(DateTime); /轉(zhuǎn)換時間為字符串,例如:20:50 MyDate:= StrToDate(DateStr); /轉(zhuǎn)換字符串為日期 MyTime:= StrToTime(TimeStr); /轉(zhuǎn)換字符串為時間 DateTime:= MyDate + MyTime; /相加得到datetime DateTime := DateTime + (15/60/24);/加15分鐘 DateStr:= FormatDateTime('yyyy-mmmm-dd',MyDate); 1996-January-08 DateStr:= FormatDateTime('mmm,d,yy,ddd',MyDate); Jan,8,96,Mon DateStr:= FormatDateTime('dddd/dd/mm/yy',MyDate); Monday/08/01/96 TimeStr:= FormatDateTime('t',MyTime); &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024至2030年燒成粘土制品項目投資價值分析報告
- 2024至2030年振動沸騰冷卻床項目投資價值分析報告
- 2024至2030年雙撥號電話機項目投資價值分析報告
- 2024至2030年中國銘牌絲印不干膠數(shù)據(jù)監(jiān)測研究報告
- 2024至2030年中國蒙賽爾土壤比色卡行業(yè)投資前景及策略咨詢研究報告
- 2024年儲熱式梭式窯項目可行性研究報告
- 2025屆高考數(shù)學(xué)統(tǒng)考二輪復(fù)習(xí)增分強化練十一三角恒等變換與解三角形理含解析
- 電子地圖使用許可與服務(wù)合作協(xié)議
- 2024-2030年膠原修復(fù)療法行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2024-2030年羊毛制品行業(yè)市場發(fā)展分析與發(fā)展趨勢及投資前景預(yù)測報告
- 2024年秋季新人教PEP版三年級上冊英語全冊教案
- GB/T 15688-2024動植物油脂不溶性雜質(zhì)含量的測定
- 滬科版(2024)八年級全一冊物理第一學(xué)期期中學(xué)業(yè)質(zhì)量測試卷 2套(含答案)
- 2024云南黃金集團招聘高校畢業(yè)生72人(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
- DZ∕T 0212.3-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 鹽類 第3部分:古代固體鹽類(正式版)
- 化工和危險化學(xué)品生產(chǎn)經(jīng)營單位二十條重大隱患判定標(biāo)準(zhǔn)釋義(中化協(xié))
- 新教材外研版高中英語選擇性必修第一冊各單元重點語法歸納總結(jié).文檔
- 愚公移山英文 -中國故事英文版課件
- 企業(yè)EHS風(fēng)險管理基礎(chǔ)智慧樹知到答案章節(jié)測試2023年華東理工大學(xué)
- 課件交互設(shè)計
- 易燃易爆物質(zhì)和物品參考名錄-國家應(yīng)急管理部研究中心編制
評論
0/150
提交評論