使用定時器的目的是為了週期性的執行某一任務,或者是到了某個指定時間去執行某一任務。要達到這一目的,一般有兩個常見的方法。乙個是用linux內部的三個定時器,另乙個是用sleep, usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday, difftime等自己來計算時間間隔,然後時間到了就執行某一任務,但是這種方法效率低,所以不常用。
首先來看看linux作業系統為每乙個程序提供的3個內部計時器。
用到的函式有:
#include
int getitimer(int which,
struct itimerval *value)
;
int setitimer(int which,
struct itimerval*newvalue,
struct itimerval* oldvalue)
;
strcut timeval;
struct itimerval
;
it_interval用來指定每隔多長時間執行任務, it_value用來儲存當前時間離執行任務還有多長時間。比如, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少乙個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出訊號(告訴使用者時間到了,可以執行任務了),並且系統自動把it_value的時間重置為 it_interval的值,即2秒,再重新計數。 為了幫助你理解這個問題,我們來看乙個例子:
#include
#include
#include
#include
#include
staticchar msg[
]= 「time is running out\n」;
staticint len;
// 向標準錯誤輸出資訊,告訴使用者時間到了
void prompt_info(int signo)
// 建立訊號處理機制
void init_sigaction(
void
)void init_time(
)int main(
)
該程式的itmer_real定時器,每隔2秒鐘都會傳送乙個sigalrm訊號,當主函式接收到了這個訊號之後,呼叫訊號處理函式 prompt_info在標準錯誤上輸出time is running out這個字串。
itimer_virtual和itimer_prof的使用方法類似,當你在setitimer裡面設定的定時器為 itimer_virtual的時候,你把sigaction裡面的sigalrm改為si**talarm, 同理,itimer_prof對應sigprof。
不過,你可能會注意到,當你用itimer_virtual和itimer_prof的時候,你拿乙個秒錶,你會發現程式輸出字串的時間間隔會不止2秒,甚至5-6秒才會輸出乙個,至於為什麼,自己好好琢磨一下。
如果函式init_sigaction報錯:
解決方法:在檔案最開頭加上如下**(在所有#include之前)
#define _xopen_source下面我們來看看用sleep以及usleep怎麼實現定時執行任務。
#include
#include
#include
#include
staticchar msg[
]= 「i received a msg.\n」;
int len;
void show_msg(int signo)
int main(
)return0;
}
看到了吧,這個要比上面的簡單多了,而且你用秒錶測一下,時間很準,指定2秒到了就給你輸出乙個字串。所以,如果你只做一般的定時,到了時間去執行乙個任務,這種方法是最簡單的。
下面我們來看看,通過自己計算時間差的方法來定時:
#include
#include
#include
#include
#include
staticchar msg[
]= 「i received a msg.\n」;
int len;
static time_t lasttime;
void show_msg(int signo)
int main()}
return0;
}
這個和上面不同之處在於,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函式換成gettimeofday,這個可以精確到微妙。(注:1秒=1000毫秒ms =106微秒µs) 上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,採用哪種方法,就看你程式的需要。
#include
#include
#include//itimerval結構體的定義
int handle_count=0;
void set_time(void
)void alarm_handle(
int sig)
void main(
void
)
return
;}
定時器使用
dword winapi checksendinfovector lpvoid lpparameter return 0 void callback dotimer hwnd hwnd,uint umsg,uint ptr idevent,dword dwtime timerproc的引數hwnd是...
Delphi Timer定時器使用
timer定時器是乙個非視覺化元件,能夠定時觸發ontimer事件,完成模擬時鐘 系統延時 倒計時等工作。在system選項卡中。1 timer的主要屬性 1 enabled屬性 當值為true時,開啟定時器,否則關閉定時器。預設值為true。2 interval屬性 控制ontimer事件觸發的時...
workman定時器使用
workerman 定時器例子,可單獨使用,稍加改善可以開啟乙個守護程序,用來做一些定時發布等等類似的任務,使用方便,不需要額外的擴充套件或者類似 crontab 等工具。以下是測試程式 php view plain copy use workerman autoloader use workerm...