



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、VisualC+實(shí)現(xiàn)微秒級(jí)精度定時(shí)器I 如國 i 在工產(chǎn)控制系統(tǒng)中,有許多需要定時(shí)完成的操作,如:定時(shí)顯示當(dāng)前時(shí)間,定時(shí)刷新屏幕上的進(jìn)度條,上位機(jī)定時(shí)向下位機(jī)發(fā)送命令和傳送數(shù)據(jù)等。特別是在對(duì)控制性能要求較高的控制系統(tǒng)和數(shù)據(jù)采集系統(tǒng)中,就更需要精確定時(shí)操作。眾所周知,Windows 是基于消息機(jī)制的系統(tǒng),任何事件的執(zhí)行都是通過發(fā)送和接收消息來完成的。這樣就帶來了一些問題,如一旦計(jì)算機(jī)的 CPU 被某個(gè)進(jìn)程占用,或系統(tǒng)資源緊張時(shí),發(fā)送到消息隊(duì)列中的消息就暫時(shí)被掛起,得不到實(shí)時(shí)處理。因此,不能簡單地通過 Windows 消息引發(fā)一個(gè)對(duì)定時(shí)要求嚴(yán)格的事件。另外,由于在 Windows 中已經(jīng)封裝了計(jì)算
2、機(jī)底層硬件的訪問,所以要想通過直接利用訪問硬件來完成精確定時(shí),也比較困難。在實(shí)際應(yīng)用時(shí),應(yīng)針對(duì)具體定時(shí)精度的要求,采取與之相適應(yīng)的定時(shí)方法。本實(shí)例實(shí)現(xiàn)了一中微秒級(jí)的精確定時(shí),程序的界面提供了兩個(gè)Edit編輯框,其中一個(gè)編輯框輸入用戶理想的定時(shí)長度,另外一個(gè)編輯框返回實(shí)際的時(shí)間長度,經(jīng)過大量的實(shí)驗(yàn)測試,一般情況下誤差不超過5 個(gè)微秒。程序的運(yùn)行界面如圖一所示:圖一、實(shí)現(xiàn)微秒級(jí)的精確定時(shí)器一、實(shí)現(xiàn)方法VisualC+中提供了很多關(guān)于時(shí)間操作的函數(shù),利用它們控制程序能夠精確地完成定時(shí)和計(jì)時(shí)操作。VisaulC+中的 WM_TIME 輔息映射能進(jìn)行簡單的時(shí)間控制。首先調(diào)用函數(shù) SetTimer()設(shè)置
3、定時(shí)間隔(退出程序時(shí)別忘了調(diào)用和 SetTimer()配對(duì)使用的 KillTimer()函數(shù)),如 SetTimer(0,200,NULL)即為設(shè)置 200ms 的時(shí)間間隔。然后在應(yīng)用程序中增加定時(shí)響應(yīng)函數(shù)OnTimer(),并在該函數(shù)中添加響應(yīng)的處理語句,用來完成到達(dá)定時(shí)時(shí)間的操作。這種定時(shí)方法非常簡單,但其定時(shí)功能如同 Sleep()函數(shù)的延時(shí)功能一樣,精度非常低,只可以用來實(shí)現(xiàn)諸如位圖的動(dòng)態(tài)顯示等對(duì)定時(shí)精度要求不高的情況。微軟公司在其多媒體 Windows 中提供了精確定時(shí)器的底層 API 支持。利用多媒體定時(shí)器可以很精確地讀出系統(tǒng)的當(dāng)前時(shí)間,并且能在非常精確的時(shí)間間隔內(nèi)完成一個(gè)事件、函
4、數(shù)或過程的調(diào)用。利用多媒體定時(shí)器的基本功能,可以通過兩種方法實(shí)現(xiàn)精確定時(shí)。1)使用 timeGetTime()函數(shù),該函數(shù)定時(shí)精度為 ms 級(jí),返回從 Windows 啟動(dòng)開始所經(jīng)過的時(shí)間。由于使用該函數(shù)是通過查詢的方式進(jìn)行定時(shí)控制的,所以,應(yīng)該建立定時(shí)循環(huán)來進(jìn)行定時(shí)事件的控制。2)使用 timeSetEvent()函數(shù),該函數(shù)原型如下:MMRESULTtimeSetEvent(UINTuDelay,UINTuResolution,LPTIMECALLBACKIpTimeProjDWORDdwUserUINTfuEvent);該函數(shù)的參數(shù)說明如下:參數(shù) uDelay 表示延遲時(shí)間;參數(shù) uRe
5、solution 表示時(shí)間精度,在 Windows 中缺省值為 1ms;lpTimeProc 表示回調(diào)函數(shù),為用戶自定義函數(shù),定時(shí)調(diào)用;參數(shù) dwUser 表示用戶提供的回調(diào)數(shù)據(jù);參數(shù) fuEvent 為定時(shí)器的事件類型,TIME_ONESHOT表示執(zhí)行一次;TIME_PERIODIC 周期性執(zhí)行。具體應(yīng)用時(shí),可以通過調(diào)用 timeSetEvent()函數(shù),將需要周期性執(zhí)行的任務(wù)定義在 lpTimeProc 回調(diào)函數(shù)中(如:定時(shí)采樣、控制等),從而完成所需處理的事件。需要注意的是:任務(wù)處理的時(shí)間不能大于周期間隔時(shí)間。另外,在定時(shí)器使用完畢后,應(yīng)及時(shí)調(diào)用 timeKillEvent()將之釋放。
6、下面這段代碼的主要功能是設(shè)置兩個(gè)時(shí)鐘定時(shí)器,一個(gè)間隔是 1ms,一個(gè)間隔是 2s。每執(zhí)行一次,把當(dāng)前系統(tǒng)時(shí)鐘值輸入文件cure.out中,以比較該定時(shí)器的精確度。# defineONE_MILLI_SECOND1/定義 1ms 和 2s 時(shí)鐘間隔,以 ms 為單位;# defineTWO_SECOND2000#defineTIMER_ACCURACY1/定義時(shí)鐘分辨率,以 ms 為單位UINTwTimerRes_1ms,wTimerRes_2s;/定義時(shí)間間隔UINTwAccuracy;/定義分辨率UINTTimerID_1ms,TimerID_2s;/定義定時(shí)器句柄/CCureApp:CCu
7、reApp():fout(cure.out,ios:out)打開輸出文件cure.out/給時(shí)間間隔變量賦值wTimerRes_1ms=ONE_MILLI_SECOND;wTimerRes_2s=TWO_SECOND;TIMECAPStc;/ 利 用 函 數(shù)timeGetDevCaps取 出 系 統(tǒng) 分 辨 率 的 取 值 范 圍 , 如 果 無 錯(cuò) 則 繼 續(xù) ;if(timeGetDevCaps(&tc,sizeof(TIMECAPS)=TIMERR_NOERROR)wAccuracy=min(max(tc.wPeriodMin,/分辨率的值不能超出系統(tǒng)的取值范圍TIMER_ACC
8、URACY),tc.wPeriodMax);/調(diào)用 timeBeginPeriod 函數(shù)設(shè)置定時(shí)器的分辨率timeBeginPeriod(wAccuracy);/設(shè)置定時(shí)器InitializeTimer();CCureApp:CCureApp()fout結(jié)束時(shí)鐘fout+ms:1ms:)/加裝 1ms 定時(shí)器voidCCureApp:StartOneMilliSecondTimer()(if(TimerID_1ms=timeSetEvent(wTimerRes_1ms,wAccuracy,(LPTIMECALBACK)OneMilliSecondProc,/回調(diào)函數(shù);(DWORD)this,/
9、用戶傳送到回調(diào)函數(shù)的數(shù)據(jù);TIME_PERIODIC)=0)/周期調(diào)用定時(shí)處理函數(shù);(AfxMessageBox(不能進(jìn)行定時(shí)!,MB_OK|MB_ICONASTERISK);)elsefout16ms 計(jì)時(shí):endl;/不等于 0 表明加裝成功,返回此定時(shí)器的句柄;)在精度要求較高的情況下,如要求定時(shí)誤差不大于 1ms 時(shí),還可以利用 GetTickCount()函數(shù)返回自計(jì)算機(jī)啟動(dòng)后的時(shí)間,該函數(shù)的返回值是 DWORD1,表示以 ms 為單位的計(jì)算機(jī)啟動(dòng)后經(jīng)歷的時(shí)間間隔。通過兩次調(diào)用 GetTickCount()函數(shù),然后控制它們的差值來取得定時(shí)效果.下列的代碼可以實(shí)現(xiàn) 50ms 的精確定
10、時(shí),其誤差是毫秒級(jí)的。/起始值和中止值DWORDdwStart,dwStop;dwStop=GetTickCount();while(TRUE)/上一次的中止值變成新的起始值dwStart=dwStop;/此處添加相應(yīng)控制語句dodwStop=GetTickCount();while(dwStop50dwStart);用上述兩種方式取得的定時(shí)效果雖然在許多場合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級(jí)的,而且在要求定時(shí)時(shí)間間隔小時(shí),實(shí)際定時(shí)誤差大。對(duì)于精確度要求更高的定時(shí)操作,則應(yīng)該使用QueryPerformanceFrequency()和 QueryPerformanceCounter
11、()函數(shù)。這兩個(gè)函數(shù)是 VisualC+提供并且僅供 Windows95 及其后續(xù)版本使用,其精度與 CPU 的時(shí)鐘頻率有關(guān),它們要求計(jì)算機(jī)從硬件上支持精確定時(shí)器。QueryPerformanceFrequency()函數(shù)和 QueryPerformanceCounter()函數(shù)的原型如下:BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);BOOLQueryPerformanceCounter(LARGE_INTEGER*lpCount);上述兩個(gè)函數(shù)的參數(shù)的數(shù)據(jù)類型 LARGE_INTEGE 既可以是一個(gè) 8 字節(jié)長的整型數(shù),
12、也可以是兩個(gè) 4字節(jié)長的整型數(shù)的聯(lián)合結(jié)構(gòu),其具體用法根據(jù)編譯器是否支持 64 位而定。該類型的定義如下:typedefunion_LARGE_INTEGERstructDWORDLowPart;/4 字節(jié)整型數(shù)LONGHighPart;/4 字節(jié)整型數(shù);LONGQuadPart;/8 字節(jié)整型數(shù)LARGE_INTEGER;使用 QueryPerformanceFrequency()和 QueryPerformanceCounter()函數(shù)進(jìn)行精確定時(shí)的步驟如下:1、首先調(diào)用 QueryPerformanceFrequency()函數(shù)取得高精度運(yùn)行計(jì)數(shù)器的頻率 f,單位是每秒多少次(n/s),此
13、數(shù)一般很大;2、在需要定時(shí)的代碼的兩端分別調(diào)用 QueryPerformanceCounter()以取得高精度運(yùn)行計(jì)數(shù)器的數(shù)值 n1、n2,兩次數(shù)值的差值通過 f 換算成時(shí)間間隔,t=(n2-n1)/f,當(dāng) t 大于或等于定時(shí)時(shí)間長度時(shí),啟動(dòng)定時(shí)器;二、編程步驟1、啟動(dòng) VisualC+6.0,生成一個(gè)基于對(duì)話框的應(yīng)用程序,將程序命名為HightTimer;2、在對(duì)話框面板中添加控件,布局如圖一所示,其中包含兩個(gè)靜態(tài)文本框,兩個(gè)編輯框和兩個(gè)按紐。上面和下面位置的編輯框的 ID 分別為 IDC_TESTSIDC_ACTUALEXIT按紐的 ID 為 IDOK,TEST按紐 ID 為 ID_TES
14、T;3、通過 ClassWizard 添加成員變量,兩個(gè)編輯框控件分別對(duì)應(yīng)為 DWORDm_dwTesUDWORDm_dwAct 另外添加TEST按紐的鼠標(biāo)單擊消息處理函數(shù);4、添加代碼,編譯運(yùn)行程序。三、程序代碼/LARGE_INTEGERMySleep(LARGE_INTEGERInterval)/功能:執(zhí)行實(shí)際的延時(shí)功能,Interval 參數(shù)為需要執(zhí)行的延時(shí)與時(shí)間有關(guān)的數(shù)量,此函數(shù)返回執(zhí)行后實(shí)際所用的時(shí)間有關(guān)的數(shù)量;LARGE_INTEGERprivious,current,Elapse;QueryPerformanceCounter(&privious);current=pr
15、ivious;while(current.QuadPart-privious.QuadPartInterval.QuadPart)QueryPerformanceCounter(¤t);Elapse.QuadPart=current.QuadPart-privious.QuadPart;returnElapse;voidCHightTimerDlg:OnTest()/TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);/取輸入的測試時(shí)間值到與編輯框相關(guān)聯(lián)的成員變量 m_dwTest 中;LARGE_I
16、NTEGERfrequence;/取高精度運(yùn)行計(jì)數(shù)器的頻率,若硬件不支持則返回 FALSEif(!QueryPerformanceFrequency(&frequence)MessageBox(Yourcomputerhardwaredoesntsupportthehigh-resolutionperformancecounter,NotSupport,MB_ICONEXCLAMATION|MB_OK);LARGE_INTEGERtest,ret;/通過頻率換算微秒數(shù)到對(duì)應(yīng)的數(shù)量(與 CPU 寸鐘有關(guān)),1 秒=1000000 微秒;test.QuadPart=frequence.QuadPart*m_dwTest/1000000;ret=MySleep(test);/調(diào)用此函數(shù)開
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 挖掘教育大數(shù)據(jù)的潛力洞悉學(xué)生內(nèi)心世界與成長軌跡
- 教育資源均衡分配的新思路在線教育的應(yīng)用與實(shí)踐
- 智慧城市的網(wǎng)絡(luò)空間安全與隱私保護(hù)研究
- 幼兒教育中游戲化教育的策略與技巧
- 空壓機(jī)油培訓(xùn)課件
- 抖音商戶直播樣品展示順序管理制度
- 抖音商戶商品拍攝燈光布設(shè)執(zhí)行制度
- BRD4-ligand-7-生命科學(xué)試劑-MCE
- 廣西貴港市平南縣2025屆化學(xué)九上期末達(dá)標(biāo)檢測試題含解析
- 2024-2025學(xué)年廣東省陽江市東平中學(xué)化學(xué)九年級(jí)第一學(xué)期期末經(jīng)典試題含解析
- 淹溺診療規(guī)范內(nèi)科學(xué)診療規(guī)范診療指南2023版
- PremiereProCC視頻剪輯基礎(chǔ)教程PPT完整版全套教學(xué)課件
- 新教材北師大版高中英語選擇性必修第一冊(cè)全冊(cè)各單元學(xué)案(單詞短語句型寫作等知識(shí)點(diǎn)匯總)
- 鍍鋅板國家新標(biāo)準(zhǔn)規(guī)定
- 《電工學(xué)》“課程思政”教學(xué)設(shè)計(jì)案例
- 數(shù)字時(shí)代的商務(wù)英語寫作知到章節(jié)答案智慧樹2023年對(duì)外經(jīng)濟(jì)貿(mào)易大學(xué)
- 檢驗(yàn)科溝通技巧及其它
- 2022年安徽大學(xué)科研助理(校聘)招聘60人筆試備考題庫及答案解析
- 四年級(jí)閱讀訓(xùn)練概括文章主要內(nèi)容(完美)
- YY/T 0995-2015人類輔助生殖技術(shù)用醫(yī)療器械術(shù)語和定義
- GB/T 19352.1-2003熱噴涂熱噴涂結(jié)構(gòu)的質(zhì)量要求第1部分:選擇和使用指南
評(píng)論
0/150
提交評(píng)論