網路程式定時器

2021-10-21 15:14:26 字數 1316 閱讀 6576

伺服器需要處理定時事件,比如定期檢測乙個客戶連線的活動狀態。伺服器程式通常管理著眾多的定時事件,因此有效地組織這些定時事件,使之能在預期的事件點被觸發且不影響伺服器的主要邏輯,對於伺服器的效能有著至關重要的影響。為此,我們要將每個定時事件分別封裝稱為定時器,並實現某種容器類資料結構,比如鍊錶、排序鍊錶和時間輪,將所有的定時器串聯起來,以實現對定時事件的統一管理。

定時機制是定時器得以被處理的原動力。linux提供到了三種定時方法,他們是:

這兩個選項僅對於資料接收和傳送相關的socket專用系統呼叫有效,這些系統呼叫包括send、sendmsg、recv、recvmsg、accept、connect。

下面的**是設定connect的超時時間

.....

struct timeval timeout;

timeout.tv_sec = time;

timeout.tv_usec = 0;

socklen_t len = sizeof(timeout);

ret = setsocketopt(sockfd, sol_socket, so_sndtimeo, &timeout, len);

......

其實就是給socketfd設定選項。

由alarm和setitimer函式設定的實時鬧鐘一旦超時,將觸發sigalrm訊號。因此我們可以利用該訊號的訊號處理函式來處理定時任務。但是要處理多個定時任務,我們就需要不斷的觸發sigalrm訊號,並在其訊號處理函式中執行到期的任務。一般,sigalrm訊號按照固定的頻率生成,即由alarm或setitimer函式設定的定時週期t保持不變。如果某個定時任務的超時時間不是t的整數倍,那麼它實際被執行的時間和預期的時間將略有偏差。因此定時週期t反應的定時的精度。

linux下的3組i/o復用系統呼叫都帶有超時引數,因此他們不僅能統一處理訊號和i/o事件,也能統一處理定時事件。但是由於i/o復用系統呼叫可能在超時時間到期之前就返回(有i/o事件發生),所以如果我們要利用它來定時,就需要不斷更新定時引數以反映剩餘的事件。

#define timeout 5000

int timeout = timeout;

time_t start = time(null);

time_t end = time(null);

while(1)

if(number == 0)

end = time(null);

timeout -= (end-start) * 1000;

if(timeout <= 0)

// handle connections

}

QElapsedTimer定時器記錄程式執行時間

qelapedtimer類提供了一種快速計算執行時間的方法,從qt4.7引入。qelapsedtimer類通常用於快速計算兩個事件之間經過了多少時間。它的api與qtime相似,因此可以將正在使用的 快速移植到新類中。但是,與qtime不同,qelapsedtimer在可能的情況下嘗試使用單調時鐘。...

Mysql 檢視定時器 開啟定時器 設定定時器時間

1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...

定時器 STM32定時器 基本定時器1

我是鼎!定時器時鐘一定要明確其中有哪些變數。上圖為stm407資料手冊摘出來的,可能看不清楚,其實就蘊含了幾點資訊。注意一點,我們看圖2,我們以apb1舉例,上面掛著很多的外設,包括usart1 adc 以及定時器,我們知道apb1上面最高時鐘頻率為84mhz,但是定時器的時鐘是要在此基礎上乘2,也...