全國計算機(jī)一級MS-WORD(考點(diǎn)分析)_第1頁
全國計算機(jī)一級MS-WORD(考點(diǎn)分析)_第2頁
全國計算機(jī)一級MS-WORD(考點(diǎn)分析)_第3頁
全國計算機(jī)一級MS-WORD(考點(diǎn)分析)_第4頁
全國計算機(jī)一級MS-WORD(考點(diǎn)分析)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、一級MSWORD文字處理操作考點(diǎn)分析一、考點(diǎn)分析概述注意:打開文件后,先將視圖方式切換為頁面視圖(視圖頁面,以方便操作)1、WORD文檔文件(擴(kuò)展名為 .doc)的新建、打開、保存、另存;插入文件(插入文件)2、字體格式的設(shè)置(選定需要設(shè)置的文字或段落:格式字體,可設(shè)置文字的:中文字體、西文字體、字形、字號、顏色、下劃線、著重號、效果、字符間距、字體縮放、文字動態(tài)效果等)3、段落格式的設(shè)置(選定需要設(shè)置的段落:格式段落,可設(shè)置段落的:對齊方式、左縮進(jìn)、右縮進(jìn)、特殊格式的首行縮進(jìn)和懸掛縮進(jìn)、行距、段前間距、段后間距等)4、移動段落、復(fù)制段落、兩段合為一段(退格鍵)、一段分為兩段(回車鍵)5、字符

2、邊框、字符底紋;文字邊框、文字底紋;段落邊框、段落底紋;頁面邊框(選定需要設(shè)置的內(nèi)容:格式邊框和底紋,注意應(yīng)用范圍:文字或段落)6、查找、替換(編輯查找、替換,如:將文中出現(xiàn)的所有“我們”一詞全部替換為“他們”;如:為文中出現(xiàn)的所有“軌道”一詞添加波浪線,操作方法是:選定需查找的內(nèi)容范圍,編輯替換在“查找內(nèi)容”右邊的文本框中輸入“軌道” 在“替換為”右邊的文本框中也輸入“軌道”單擊“高級”按鈕選定“替換為”右邊文本框中的“軌道”單擊“格式”字體,從“下劃線線型”處選擇波浪線單擊“全部替換” 。)7、首字下沉(選定需要下沉的文字:格式首字下沉)8、分欄(選定需要分欄的內(nèi)容:格式分欄,注意:碰到涉

3、及最后一段的分欄,若分欄不成功,則要考慮最后一段的后面是否有空行)9、項目符號和編號(選定需要設(shè)置的內(nèi)容:格式項目符號和編號)10、插入頁碼(插入頁碼);插入腳注(選定需要插入腳注的內(nèi)容,插入引用腳注和尾注,單擊“插入”按鈕,光標(biāo)即跳到頁腳處,輸入腳注內(nèi)容即可 );插入特殊符號、圖片、藝術(shù)字11、設(shè)置頁眉頁腳(視圖頁眉和頁腳,將光標(biāo)定位到頁眉或頁腳處,輸入即可)12、頁面設(shè)置(文件頁面設(shè)置,可設(shè)置頁邊距、頁面方向、紙張大小、頁眉頁腳距邊界距離、文檔網(wǎng)格用來指定每行多少字符、每頁多少行)13、表格(插入表格;表格的自動套用格式;設(shè)置行高和列寬;插入和刪除行列;合并和拆分單元格;單元格內(nèi)容對齊方式

4、9種;表格對齊方式;設(shè)置邊框底紋;繪制斜線表頭;文字和表格的相互轉(zhuǎn)換;計算和排序)注意:操作完畢,先保存文件再關(guān)閉文件二、考點(diǎn)分析詳述考點(diǎn)1:Word基本操作Word基本操作主要包括輸入文字、新建文件、插入文件、刪除段落和保存文件。本知識點(diǎn)考核的幾率約為100%,其操作步驟如下:輸入文字:直接在光標(biāo)閃動處將文字輸入到Word文檔。新建文件:選擇【文件】|【新建】命令。插入文件:步驟1:打開插入文件的Word文檔,選擇【插入】|【文件】命令,彈出如圖1.20所示的對話框。圖1.20步驟2:在“查找范圍”框中指定文件所在的位置,選擇需要插入的文件,單擊“插入”按鈕。刪除段落:步驟1:選定需要刪除的

5、段落。步驟2:按下“Backspace”鍵。保存文件:選擇“文件”菜單中“保存”命令。如果需要在保存時更換文件名或路徑,則:步驟1:選擇“文件”菜單中“另存為”命令,彈出“另存為”對話框,如圖1.21所示。步驟2:在“另存為”對話框中選擇保存路徑,輸入文件名,選擇保存類型,然后單擊“保存”按鈕。圖1.21考點(diǎn)2:字體的設(shè)置本知識點(diǎn)考核的幾率約為100%,其操作步驟如下:步驟1:選中需要設(shè)置字體的段落。步驟2:選擇【格式】|【字體】命令,彈出如圖1.22所示的對話框。圖1.22步驟3:在“字體”選項下可以對字體、字形、字號、顏色、下劃線、上標(biāo)、下標(biāo)、陰影和著重號等進(jìn)行設(shè)置。步驟4:單擊對話框中的

6、“字符間距”選項卡,可以設(shè)置文字之間的距離。步驟5:單擊對話框中的“文字效果”選項卡,可以設(shè)置文字動態(tài)效果。步驟6:設(shè)置完成后單擊“確定”按鈕??键c(diǎn)3:段落的設(shè)置本知識點(diǎn)考核的幾率約為96%,其操作步驟如下:步驟1:選中需要設(shè)置的段落。步驟2:選擇【格式】|【段落】命令,彈出如圖1.23所示的對話框,在“縮進(jìn)和間距”選項卡中可以對段落縮進(jìn)、間距、行距、對齊方式等進(jìn)行設(shè)置。設(shè)置完成后單擊“確定”按鈕。圖1.23考點(diǎn)4:表格的設(shè)置Word中考查表格的操作主要包括插入表格、表格屬性的設(shè)置、合并單元格和拆分單元格等。本知識點(diǎn)考核的幾率約為100%,其操作步驟如下:插入表格:選擇【表格】|【插入】|【表

7、格】命令,彈出如圖1.24所示的對話框,在其中設(shè)置需要插入表格的行、列數(shù)及列寬等。圖1.24設(shè)置表格屬性:選定表格,選擇【表格】|【表格屬性】命令,彈出如圖1.25所示的對話框,在此對話框中可以對表格的行高、列寬、單元格、對齊、縮進(jìn)、環(huán)繞等進(jìn)行設(shè)置。圖1.25合并、拆分單元格:選定要合并的單元格后,單擊【表格】|【合并單元格】命令,可以合并選中的單元格;選定單元格,選擇【表格】|【拆分單元格】命令,彈出如圖1.26所示的對話框,設(shè)置要拆分的行、列數(shù),單擊“確定”按鈕。圖1.26考點(diǎn)5:分欄本知識點(diǎn)考核的幾率約為37%,其操作步驟如下:步驟1:選定需要分欄的文字,選擇【格式】|【分欄】命令,彈出

8、如圖1.27所示的對話框。圖1.27步驟2:分別對欄數(shù)、欄寬、欄間距、分割線等進(jìn)行設(shè)置,設(shè)置完成后單擊“確定”按鈕。考點(diǎn)6:首字下沉本知識點(diǎn)考核的幾率約為16%,其操作步驟如下:步驟1:選定需要設(shè)置的文字,選擇【格式】|【首字下沉】命令,彈出如圖1.28所示的對話框。圖1.28步驟2:設(shè)置下沉位置、下沉行數(shù)、字體、距正文距離等,設(shè)置完成后單擊“確定”按鈕。考點(diǎn)7:查找和替換本知識點(diǎn)考核的幾率約為50%,其操作步驟如下:步驟1:選擇【編輯】|【查找】命令,彈出如圖1.29所示的對話框,輸入將要查找的內(nèi)容,單擊“查找下一處”按鈕,找到需要查找的內(nèi)容。圖1.29步驟2:單擊“替換”選項卡,彈出如圖1

9、.30所示的對話框。在“替換為”欄中輸入需要替換的內(nèi)容,單擊“替換”按鈕或“全部替換”按鈕則可實(shí)現(xiàn)替換功能。圖1.30考點(diǎn)8:插入頁碼、腳注和尾注、符號本知識點(diǎn)考核的幾率約為9%,其操作方法描述如下:插入頁碼:選擇【插入】|【頁碼】命令,彈出如圖1.31所示的對話框,設(shè)置頁碼的位置、對齊方式和格式等。設(shè)置完成后單擊“確定”按鈕。圖1.31插入腳注和尾注:光標(biāo)放在需要插入腳注和尾注的位置,選擇【插入】|【引用】|【腳注和尾注】命令,彈出如圖1.32所示的對話框,對插入內(nèi)容及編號方式進(jìn)行設(shè)置和選擇,然后單擊“插入”按鈕。圖1.32插入符號:光標(biāo)放在需要插入符號的位置,選擇【插入】|【符號】命令,彈

10、出如圖1.33所示的對話框,選定需要插入的符號,然后單擊“插入”按鈕。圖1.33插入文本框:光標(biāo)放在需要插入文本框的位置,選擇【插入】|【文本框】|【橫排(豎排)】命令,拖動鼠標(biāo)畫出文本框??键c(diǎn)9:頁眉和頁腳本知識點(diǎn)考核的幾率約為1%,其操作步驟如下:步驟1:選擇【視圖】|【頁眉和頁腳】命令,出現(xiàn)頁眉和頁腳操作界面。步驟2:在光標(biāo)閃動處可以添加文字,在彈出的“頁眉和頁腳”工具欄中可以對插入頁碼的格式進(jìn)行設(shè)置,選擇“在頁眉和頁腳間切換”命令進(jìn)行對頁眉和頁腳的設(shè)置。考點(diǎn)10:數(shù)據(jù)排序本知識點(diǎn)考核的幾率約為23%,其操作步驟如下:步驟1:選定需要排序的數(shù)據(jù),選擇【表格】|【排序】命令,彈出如圖1.3

11、4所示的對話框。圖1.34步驟2:設(shè)置“排序依據(jù)”和“類型”,單擊“確定”按鈕。考點(diǎn)11:公式計算本知識點(diǎn)考核的幾率約為33%,其操作步驟如下:步驟1:光標(biāo)放在需要計算結(jié)果的單元格,選擇【表格】|【公式】命令,彈出如圖1.35所示的對話框。圖1.35步驟2:在“粘貼函數(shù)”下拉列表中選定公式,或者直接輸入計算公式,按題目要求選擇數(shù)字格式,單擊“確定”按鈕。考點(diǎn)12:邊框和底紋本知識點(diǎn)考核的幾率約為20%,其操作步驟如下:步驟1:選定需要添加邊框和底紋的對象,選擇【格式】|【邊框和底紋】命令,彈出如圖1.36所示的對話框,在“邊框”選項卡中選擇和設(shè)置需要的邊框。圖1.36步驟2:選擇“底紋”選項卡

12、,在“底紋”選項卡中選擇和設(shè)置需要的底紋,設(shè)置完畢后單擊“確定”按鈕??键c(diǎn)13:英文大小寫轉(zhuǎn)換本知識點(diǎn)考核的幾率約為1%,其操作步驟如下:步驟1:選定需要轉(zhuǎn)換大小寫的字符,選擇【格式】|【更改大小寫】命令,彈出如圖1.37所示的對話框。圖1.37步驟2:選擇“切換大小寫”選項,單擊“確定”按鈕??键c(diǎn)14:添加項目符號和編號本知識點(diǎn)的考核幾率為20%,其操作步驟如下:添加項目符號:選定需要添加項目符號的文字,選擇【格式】|【項目符號和編號】命令,彈出如圖1.38所示的對話框,選擇需要添加項目符號的類型,然后單擊“確定”按鈕。圖1.38添加編號:單擊“編號”選項卡,根據(jù)題目要求為所選內(nèi)容設(shè)置編號,

13、如圖1.39所示。圖1.39考點(diǎn)15:設(shè)置文本框?qū)傩员局R點(diǎn)是新增考點(diǎn),其操作步驟如下:步驟1:右鍵單擊目標(biāo)文本框,在彈出菜單中選擇【設(shè)置文本框格式】命令,如圖1.40所示。圖1.40步驟2:在彈出的“設(shè)置文本框格式”對話框中,可以對文本框的顏色與線條、大小、版式等屬性進(jìn)行設(shè)置。步驟3:設(shè)置完成后單擊“確定”按鈕。圖1.34步驟2:設(shè)置“排序依據(jù)”和“類型”,單擊“確定”按鈕??键c(diǎn)11:公式計算本知識點(diǎn)考核的幾率約為33%,其操作步驟如下:步驟1:光標(biāo)放在需要計算結(jié)果的單元格,選擇【表格】|【公式】命令,彈出如圖1.35所示的對話框。圖1.35步驟2:在“粘貼函數(shù)”下拉列表中選定公式,或者直接

14、輸入計算公式,按題目要求選擇數(shù)字格式,單擊“確定”按鈕??键c(diǎn)12:邊框和底紋本知識點(diǎn)考核的幾率約為20%,其操作步驟如下:步驟1:選定需要添加邊框和底紋的對象,選擇【格式】|【邊框和底紋】命令,彈出如圖1.36所示的對話框,在“邊框”選項卡中選擇和設(shè)置需要的邊框。圖1.36步驟2:選擇“底紋”選項卡,在“底紋”選項卡中選擇和設(shè)置需要的底紋,設(shè)置完畢后單擊“確定”按鈕??键c(diǎn)13:英文大小寫轉(zhuǎn)換本知識點(diǎn)考核的幾率約為1%,其操作步驟如下:步驟1:選定需要轉(zhuǎn)換大小寫的字符,選擇【格式】|【更改大小寫】命令,彈出如圖1.37所示的對話框。圖1.37步驟2:選擇“切換大小寫”選項,單擊“確定”按鈕。考點(diǎn)

15、14:添加項目符號和編號本知識點(diǎn)的考核幾率為20%,其操作步驟如下:添加項目符號:選定需要添加項目符號的文字,選擇【格式】|【項目符號和編號】命令,彈出如圖1.38所示的對話框,選擇需要添加項目符號的類型,然后單擊“確定”按鈕。圖1.38添加編號:單擊“編號”選項卡,根據(jù)題目要求為所選內(nèi)容設(shè)置編號,如圖1.39所示。圖1.39考點(diǎn)15:設(shè)置文本框?qū)傩员局R點(diǎn)是新增考點(diǎn),其操作步驟如下:步驟1:右鍵單擊目標(biāo)文本框,在彈出菜單中選擇【設(shè)置文本框格式】命令,如圖1.40所示。圖1.40步驟2:在彈出的“設(shè)置文本框格式”對話框中,可以對文本框的顏色與線條、大小、版式等屬性進(jìn)行設(shè)置。步驟3:設(shè)置完成后單

16、擊“確定”按鈕。附錄資料:不需要的可以自行刪除C語言中如何獲取時間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時間精確到1/CLOCKS_PER_SEC秒3 計算時間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確到毫秒5 如果使用MFC的CTime類,可以用CTime:GetCurrentTime() 精確到秒6 要獲取高精度時間,可以使用BOOL QueryPerformanceFrequ

17、ency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計數(shù)器的頻率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計數(shù)器的值然后用兩次計數(shù)器的差除以Frequency就得到時間。7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標(biāo)準(zhǔn)C實(shí)現(xiàn)獲取當(dāng)前系

18、統(tǒng)時間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時間距1970年1月1日的秒數(shù),以秒計數(shù)單位,存于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必須的時間函數(shù)頭文件time_t - 時間類型(time.h

19、定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時間結(jié)構(gòu),time.h 定義如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 獲取時間,以秒計,從1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); - 轉(zhuǎn)為當(dāng)?shù)貢r間,tm 時間結(jié)構(gòu)asctime ()- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時間格式:星期 月 日

20、 時:分:秒 年-二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動以后的毫秒級時間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_t clock ( void );#includeclock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是記錄時鐘周期的,實(shí)現(xiàn)看來不會很精確,需要試驗(yàn)驗(yàn)證;-三.gettime(&t); 據(jù)說tc2.0的time結(jié)構(gòu)含有毫秒信息#include#includeint main(void)struct time t;gettime(&t);printf(The current

21、time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一個結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。-四.GetTickCount(),這個是windows里面常用來計算程序運(yùn)行時間的函數(shù);DWORD dwStart = GetTickCount();/這里運(yùn)行你的程序代碼DWORD dwEnd = GetTickCount();則(dwEnd-dwStart)就是你的程序運(yùn)行時間, 以毫秒為單位這個函數(shù)只精確到55ms,1個tick就是55ms。-五.timeGetTime()t,imeGe

22、tTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這里運(yùn)行你的程序代碼DWORD dwEnd = timeGetTime();則(dwEnd-dwStart)就是你的程序運(yùn)行時間, 以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。=/*Unix#unix時間相關(guān),也是標(biāo)準(zhǔn)庫的/*1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時區(qū)信息;time_t timegm(struct tm *tm);2.mktime使用時區(qū)信息time_t mktime(struct tm *tm)

23、;timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_t timelocal (struct tm *tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時區(qū)信息;struct tm * gmtime(const time_t *clock);4.localtime使用時區(qū)信息struct tm * localtime(const time_t *clock);1.time獲取時間,stime設(shè)置時間time_t t;t = time(&t);2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間;int stime(tim

24、e_t *tp)3.UTC=true 表示采用夏時制;4.文件的修改時間等信息全部采用GMT時間存放,不同的系統(tǒng)在得到修改時間后通過localtime轉(zhuǎn)換成本地時間;5.設(shè)置時區(qū)推薦使用setup來設(shè)置;6.設(shè)置時區(qū)也可以先更變/etc/sysconfig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t看看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍/*windows#Window里面的一些不一樣的/*

25、一.CTime () 類VC編程一般使用CTime類 獲得當(dāng)前日期和時間CTime t = GetCurrentTime();SYSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms =

26、t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts(t);/*獲得當(dāng)前日期和時間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTime:GetCurrentTime(); /獲取系統(tǒng)日期,存儲在t里面int d=t.GetDay(); /獲得

27、當(dāng)前日期int y=t.GetYear(); /獲取當(dāng)前年份int m=t.GetMonth(); /獲取當(dāng)前月份int h=t.GetHour(); /獲取當(dāng)前為幾時int mm=t.GetMinute(); /獲取當(dāng)前分鐘int s=t.GetSecond(); /獲取當(dāng)前秒int w=t.GetDayOfWeek(); /獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計算兩段時間的差值,可以使用CTimeSpan類,具體使用方法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime()

28、;CTimeSpan span=t-t1; /計算當(dāng)前系統(tǒng)時間與時間t1的間隔int iDay=span.GetDays(); /獲取這段時間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總共有多少小時int iMin=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒-三._timeb()函數(shù)_timeb定義在SYSTIMEB.H,有四個fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *t

29、imeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時間:文檔講可以到ms,有人測試,好象只能到16ms!四.設(shè)置計時器定義TIMER ID#define TIMERID_JISUANFANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時器的時候的時候銷毀掉時鐘KillTimer(TIMERID_JISUANFANGSHI);對應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch

30、(nIDEvent)-#如何設(shè)定當(dāng)前系統(tǒng)時間-windowsSYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMillisec;lpSystemTime=&m_myLocalTime;if( SetLocalTime(lpSystemTime) ) /此處換成 SetSystemTim

31、e( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:HYPERLINK

32、 /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級精度定時器的方法當(dāng)使用定時器時,在很多情況下只用到毫秒級的時間間隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個定時器后,在程序中通過處理由定時器發(fā)送到線程消息隊列中的WM_TIMER消息,而得到定時的效果(退出程序時別忘了調(diào)用和SetTimer配對使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計算機(jī)啟動后的時間,通過兩次調(diào)用GetTickCo

33、unt函數(shù),然后控制它們的差值來取得定時效果,此方式跟第一種方式一樣,精度也是毫秒級的。用這兩種方式取得的定時效果雖然在許多場合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級的,而且在要求定時時間間隔小時,實(shí)際定時誤差大。下面介紹一種能取得高精度定時的方法。在一些計算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計數(shù)器(high-resolution performance counter),利用它可以獲得高精度定時間隔,其精度與CPU的時鐘頻率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerformanceFrequency函數(shù)取得高精度運(yùn)行計數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大

34、。2、在需要定時的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時間間隔,t=(n2-n1)/f。下面舉一個例子來演示這種方法的使用及它的精確度。在VC 6.0 下用MFC建立一個對話框工程,取名為HightTimer.在對話框面板中控件的布局如下圖:其中包含兩個靜態(tài)文本框,兩個編輯框和兩個按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過MFC ClassWizard添加的成員變量也分別對應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的I

35、D為IDOK,“開始測試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /取輸入的測試時間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER frequence;if(!QueryPerformanceFrequency( &frequence) /取高精度運(yùn)行計數(shù)器的頻率,若硬件不支持則返回FALSEMessageBo

36、x(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK);LARGE_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通過頻率換算微秒數(shù)到對應(yīng)的數(shù)量(與CPU時鐘有關(guān)),1秒=1000000微秒ret = MySleep( test ); /調(diào)用此函數(shù)開始延時,返回實(shí)際花銷的數(shù)量m_dwAct = (DWORD

37、)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(FALSE); /顯示到對話框面板其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGER CHightTimerDlg:MySleep(LARGE_INTEGER Interval)/ 功能:執(zhí)行實(shí)際的延時功能 / 參數(shù):Interval 參數(shù)為需要執(zhí)行的延時與時間有關(guān)的數(shù)量 / 返回值:返回此函數(shù)執(zhí)行后實(shí)際所用的時間有關(guān)的數(shù)量 / LARGE_INTEGER privious, current, Elapse;QueryPerformanceCoun

38、ter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCounter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366, 64M內(nèi)存)測試,當(dāng)測試時間超過3微秒時,準(zhǔn)確度已經(jīng)非常高了,此時機(jī)器執(zhí)行本身延時函數(shù)

39、代碼的時間對需要延時的時間影響很小了。上面的函數(shù)由于演示測試的需要,沒有在函數(shù)級封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:執(zhí)行微秒級的延時功能 / 參數(shù):Interval 參數(shù)為需要的延時數(shù)(單位:微秒) / 返回值:若計算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE / BOOL bNormal = TRUE;LARGE_INTEGER frequence, privious, current, interval;if(!QueryPerformanceFrequency( &fr

40、equence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInterval / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = pri

41、vious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t );return bNormal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時間也很長,所以在需要幾個微秒的延時時,會影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerformanceCounter這兩個函數(shù)就能按實(shí)際需要寫出自己的延時代碼了。使用CPU時間戳進(jìn)行高精度計時對關(guān)

42、注性能的程序開發(fā)人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對不同的算法作出有說服力的性能比較。在Windows平臺下,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應(yīng)用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數(shù)器,隨系統(tǒng)的不同可以提供微秒級的計數(shù)。對于實(shí)時圖形處理、多媒體數(shù)據(jù)流處理、或者實(shí)時系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPer

43、formanceFrequency是一項基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時間戳進(jìn)行計時的高精度計時手段。以下討論主要得益于Windows圖形編程一書,第15頁17頁,有興趣的讀者可以直接參考該書。關(guān)于RDTSC指令的詳細(xì)討論,可以參考Intel產(chǎn)品手冊。本文僅僅作拋磚之用。在Intel Pentium以上級別的CPU中,有一個稱為“時間戳(Time Stamp)”的部件,它以64位無符號整型數(shù)的格式,記錄了自CPU上電以來所經(jīng)過的時鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個部件可以達(dá)到納秒級的計時精度。這個精確性是上述兩種方法所無法比擬的。在Pentium

44、以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來讀取這個時間戳的數(shù)字,并將其保存在EDX:EAX寄存器對中。由于EDX:EAX寄存器對恰好是Win32平臺下C+語言保存函數(shù)返回值的寄存器,所以我們可以把這條指令看成是一個普通的函數(shù)調(diào)用。像這樣:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因?yàn)镽DTSC不被C+的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount(

45、) _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計數(shù)器的場合,可以像使用普通的Win32 API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個返回值的差,像這樣: unsigned long t; t = (unsigned long)GetCycleCount(); /Do Something time-intensive . t -= (unsigned long)GetCycleCount(); Windows圖形編程第15頁編寫了一個類,把這個計數(shù)器封裝起來。有興趣的讀者可以去參考那個類的代碼。作者為了更精確的定時,做了一點(diǎn)小小的改進(jìn),把執(zhí)行R

46、DTSC指令的時間,通過連續(xù)兩次調(diào)用GetCycleCount函數(shù)計算出來并保存了起來,以后每次計時結(jié)束后,都從實(shí)際得到的計數(shù)中減掉這一小段時間,以得到更準(zhǔn)確的計時數(shù)字。但我個人覺得這一點(diǎn)點(diǎn)改進(jìn)意義不大。在我的機(jī)器上實(shí)測,這條指令大概花掉了幾十到100多個周期,在Celeron 800MHz的機(jī)器上,這不過是十分之一微秒的時間。對大多數(shù)應(yīng)用來說,這點(diǎn)時間完全可以忽略不計;而對那些確實(shí)要精確到納秒數(shù)量級的應(yīng)用來說,這個補(bǔ)償也過于粗糙了。 這個方法的優(yōu)點(diǎn)是: 1.高精度??梢灾苯舆_(dá)到納秒級的計時精度(在1GHz的CPU上每個時鐘周期就是一納秒),這是其他計時方法所難以企及的。 2.成本低。time

47、GetTime 函數(shù)需要鏈接多媒體庫winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說明,需要硬件的支持(雖然我還沒有見過不支持的機(jī)器)和KERNEL庫的支持,所以二者都只能在Windows平臺下使用(關(guān)于DOS平臺下的高精度計時問題,可以參考圖形程序開發(fā)人員指南,里面有關(guān)于控制定時器8253的詳細(xì)說明)。但RDTSC指令是一條CPU指令,凡是i386平臺下Pentium以上的機(jī)器均支持,甚至沒有平臺的限制(我相信i386版本UNIX和Linux下這個方法同樣適用,但沒有條件試驗(yàn)),而且函數(shù)調(diào)用的開銷是最小的。 3.具有和CPU主頻直接對應(yīng)的速率關(guān)系。一個計數(shù)相當(dāng)于1/(CPU主頻Hz數(shù))秒,這樣只要知道了CPU的主頻,可以直接計算出時間。這和QueryPerformanceCount不同,后者需要通過QueryPerformanceFrequency獲取當(dāng)前計數(shù)器每秒的計數(shù)次數(shù)才能換算成時間。 這個方法的缺點(diǎn)是: 1.現(xiàn)有的C/C+編譯器多數(shù)不直接支持使用RDTSC指令,需要用直接嵌入機(jī)器碼的方式編程,比較麻煩。 2.數(shù)據(jù)抖動比較厲害。其實(shí)對任何計量手段而言,精度和穩(wěn)定性永遠(yuǎn)是一對矛盾。如果用低精度的timeGetTime來計時,基本上每次計時的結(jié)果都是相同的;而R

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論