C語言中提供了許多庫函數(shù)來實現(xiàn)計時功能
按需定制制作可以根據(jù)自己的需求進行定制,成都網(wǎng)站建設(shè)、網(wǎng)站制作構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司成都網(wǎng)站建設(shè)、網(wǎng)站制作的運用實際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實際意義
下面介紹一些常用的計時函數(shù)
1. time()
頭文件:time.h
函數(shù)原型:time_t time(time_t * timer)
功能:返回以格林尼治時間(GMT)為標(biāo)準(zhǔn),從1970年1月1日00:00:00到現(xiàn)在的時此刻所經(jīng)過的秒數(shù)
用time()函數(shù)結(jié)合其他函數(shù)(如:localtime、gmtime、asctime、ctime)可以獲得當(dāng)前系統(tǒng)時間或是標(biāo)準(zhǔn)時間。
用difftime函數(shù)可以計算兩個time_t類型的時間的差值,可以用于計時。用difftime(t2,t1)要比t2-t1更準(zhǔn)確,因為C標(biāo)準(zhǔn)中并沒有規(guī)定time_t的單位一定是秒,而difftime會根據(jù)機器進行轉(zhuǎn)換,更可靠。
說明:C標(biāo)準(zhǔn)庫中的函數(shù),可移植性最好,性能也很穩(wěn)定,但精度太低,只能精確到秒,對于一般的事件計時還算夠用,而對運算時間的計時就明顯不夠用了。
2. clock()
頭文件:time.h
函數(shù)原型:clock_t clock(void);
功能:該函數(shù)返回值是硬件滴答數(shù),要換算成秒,需要除以CLK_TCK或者 CLK_TCKCLOCKS_PER_SEC。比如,在VC++6.0下,這兩個量的值都是1000。
說明:可以精確到毫秒,適合一般場合的使用。
3. timeGetTime()
頭文件:Mmsystem.h??引用庫: Winmm.lib
函數(shù)原型:DWORD timeGetTime(VOID);
功能:返回系統(tǒng)時間,以毫秒為單位。系統(tǒng)時間是從系統(tǒng)啟動到調(diào)用函數(shù)時所經(jīng)過的毫秒數(shù)。注意,這個值是32位的,會在0到2^32之間循環(huán),約49.71天。
說明:該函數(shù)的時間精度是五毫秒或更大一些,這取決于機器的性能??捎胻imeBeginPeriod和timeEndPeriod函數(shù)提高timeGetTime函數(shù)的精度。如果使用了,連續(xù)調(diào)用timeGetTime函數(shù),一系列返回值的差異由timeBeginPeriod和timeEndPeriod決定。
4. GetTickCount()
頭文件:windows.h
函數(shù)原型:DWORD WINAPI GetTickCount(void);
功能:返回自設(shè)備啟動后的毫秒數(shù)(不含系統(tǒng)暫停時間)。
說明:精確到毫秒。對于一般的實時控制,使用GetTickCount()函數(shù)就可以滿足精度要求。
5. QueryPerformanceCounter()、QueryPerformanceFrequency()
頭文件:windows.h
函數(shù)原型:BOOLQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
功能:前者獲得的是CPU從開機以來執(zhí)行的時鐘周期數(shù)。后者用于獲得你的機器一秒鐘執(zhí)行多少次,就是你的時鐘周期。
補充:LARGE_INTEGER既可以是一個8字節(jié)長的整型數(shù),也可以是兩個4字節(jié)長的整型數(shù)的聯(lián)合結(jié)構(gòu), 其具體用法根據(jù)編譯器是否支持64位而定:
在進行定時之前,先調(diào)用QueryPerformanceFrequency()函數(shù)獲得機器內(nèi)部定時器的時鐘頻率,然后在需要嚴(yán)格定時的事件發(fā)生之前和發(fā)生之后分別調(diào)用QueryPerformanceCounter()函數(shù),利用兩次獲得的計數(shù)之差及時鐘頻率,計算出事件經(jīng)歷的精確時間。
說明:這種方法的定時誤差不超過1微秒,精度與CPU等機器配置有關(guān),一般認為精度為透微秒級。在Windows平臺下進行高精度計時的時候可以考慮這種方法。
6. gettimeofday()
Linux C函數(shù)。
頭文件:sys/time.h
函數(shù)原型:int gettimeofday(struct timeval *tv,struct timezone *tz);
說明:其參數(shù)tv是保存獲取時間結(jié)果的結(jié)構(gòu)體,參數(shù)tz用于保存時區(qū)結(jié)果(若不使用則傳入NULL即可)。
timeval的定義為:
struct?timeval?{ ?
long?tv_sec;?//?秒數(shù)
long?tv_usec;?//微秒數(shù)
}
可見該函數(shù)可用于在linux中獲得微秒精度的時間。
說明:使用這種方式計時,精度可達微秒。經(jīng)驗證,在arm+linux的環(huán)境下此函數(shù)仍可使用。
time是C語言獲取當(dāng)前系統(tǒng)時間的函數(shù),以秒作單位,代表當(dāng)前時間自Unix標(biāo)準(zhǔn)時間戳(1970年1月1日0點0分0秒,GMT)經(jīng)過了多少秒。
形式為time_t time(time_t * t);
該函數(shù)提供兩種返回方式,返回值,和指針參數(shù)。
可以根據(jù)需要選擇。當(dāng)參數(shù)t為空指針(NULL)時,只返回值。
而NULL的定義是(void *) 0, 所以time(0)也就是time(NULL)的另一種寫法,表示只通過返回值獲取時間值。
擴展資料:
time函數(shù)
函數(shù)名稱: localtime
函數(shù)原型: struct tm *localtime(const time_t *timer)
函數(shù)功能: 返回一個以tm結(jié)構(gòu)表達的機器時間信息
函數(shù)返回: 以tm結(jié)構(gòu)表達的時間,結(jié)構(gòu)tm定義如下:
#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */
int tm_min; /* 分 - 取值區(qū)間為[0,59] */
int tm_hour; /* 時 - 取值區(qū)間為[0,23] */
int tm_mday; /* 一個月中的日期 - 取值區(qū)間為[1,31] */
int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */
int tm_year; /* 年份,其值等于實際年份減去1900 */
int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; /* 從每年的1月1日開始的天數(shù) – 取值區(qū)間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst; /* 夏令時標(biāo)識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負。*/
};
#define _TM_DEFINED
#endif
參數(shù)說明: timer-使用time()函數(shù)獲得的機器時間
參考資料來源:百度百科-time.h
//?使用?windows?的延時函數(shù)?Sleep();?實現(xiàn)
//?以下代碼實現(xiàn)每秒鐘輸出一個數(shù)字,連續(xù)輸出?10?個
#include?windows.h
#include?stdio.h
//?主函數(shù)
void?main()
{
int?i?=?0;
while(i??10)
{
printf("%d\n",?i++);
Sleep(1000);
}
}
還可以使用多媒體定時器實現(xiàn)精確延時,詳細請百度《精確延時的實現(xiàn)》
這里的分段計時,我使用空格鍵實現(xiàn)的,F(xiàn)2比較麻煩。程序開始,輸入回車開始計時,中途輸入空格可以開始新的計時,最后輸入回車完成計時。
文件存在程序目錄下的timeout.txt
真麻煩,下次這種求助才給10分,絕對不做。。。
//////////////////////////
我的代碼就是在VS2010下寫的。。。怎么會無法編譯。。。你要建一個空工程,然后加入C++源文件。
/////////////////////////////
請新建一個空工程,不要新建Win32?Console那個工程!
#include?stdio.h
#include?conio.h
#include?windows.h
#include?stdlib.h
struct?tm?????//定義時間結(jié)構(gòu)體,包括時分秒和10毫秒
{
int?hours,minutes,seconds;
int?hscd;
}time,tmp,total;????//time用以計時顯示,tmp用以存儲上一階段時間,total記總時間
int?cnt;
FILE*?fout;
//每次調(diào)用update函數(shù),相當(dāng)于時間過了10ms
void?update(struct?tm?*t)
{
(*t).hscd++;????//10ms單位時間加1
cnt++;
if?((*t).hscd==100)???//計時滿1s,進位
{
(*t).hscd=0;
(*t).seconds++;
}
if?((*t).seconds==60)???//計時滿一分,進位
{
(*t).seconds=0;
(*t).minutes++;
}
if?((*t).minutes==60)????????//計時滿一小時,進位
{
(*t).minutes=0;
(*t).hours++;
}
if((*t).hours==24)?(*t).hours=0;
//delay();
Sleep(10);??//Sleep是windows提供的函數(shù),作用是暫停程序,單位毫秒,所以此處暫停10ms
}
void?display(struct?tm?*t)
{
//此處輸出計時結(jié)果,\r為回車不換行,既一直在同一行更新時間
printf("%d:",(*t).hours);
printf("%d:",(*t).minutes);
printf("%d:",(*t).seconds);
printf("%d\r",(*t).hscd);
//printf("Now,?press?'e'?key?to?stop?the?clock...");
}
void?time_init()??//初始化時間
{
time.hours=time.minutes=time.seconds=time.hscd=0;
}
void?get_total()???//計算總時間
{
total.hscd?=?cnt?%?100;
cnt?/=?100;
total.seconds?=?cnt?%?60;
cnt?/=?60;
total.minutes?=?cnt?%?60;
cnt?/=?60;
total.hours?=?cnt;
}
int?main()
{
char?m;
time_init();
cnt?=?0;
fout?=??fopen("timeout.txt","w");
printf("Now,?press?Enter?key?to?begin?the?clock...\n");
while(1)
{
m?=?getch();
if(m?!=?'\r')?????//讀入一個輸入,如果是回車,那么跳出次循環(huán)
printf("Input?Error!\n");
else
break;
}
printf("While?counting,?you?can?press?space?to?start?a?new?time?counter!\n");
while(1)
{
if(kbhit())????//此處檢查是否有鍵盤輸入
{
m=getch();
if(m?==?'\r')?????//如果等于回車,那么計時結(jié)束,跳出循環(huán)
break;
else?if(m?==?'?')??//如果等于空格,顯示此次計時,初始化計時器
{
tmp?=?time;??????//記錄上一段計時器結(jié)果
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);?//寫入文件
time_init();
printf("\n");
}
else
{
printf("Input?Error!\n");
}
}
update(time);?????//更新計時器
display(time);????//顯示計時器時間
}
tmp?=?time;???????//輸出最后一次即使結(jié)果,寫入文件
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);
get_total();??????//計算總的時間,顯示,并寫入文件
printf("\ntotal?time:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fprintf(fout,"total?time:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fclose(fout);
getch();
}