Timer定時器開發

2022-02-03 14:31:17 字數 1676 閱讀 3506

timer定時器開發

定時器的作用是不佔執行緒的等待乙個確定時間,同樣通過callback來通知定時器到期。

參考:定時器的建立

同樣是在wftaskfactory類裡的方法:

using timer_callback_t = std::function;

class wftaskfactory

;第乙個引數為定時時間,單位為微秒。除了程式退出,定時器不可以提前結束。

定時器任務裡同樣有user_data域可以用來傳遞一些使用者資料。啟動方法和接入任務流的方法與其它任務沒有區別。

定時器的乙個高階特徵

在關於程式退出裡講到,main函式結束或exit()被呼叫的時候,所有任務必須裡執行到callback,並且沒有新的任務被調起。

這們就可能出現乙個問題,定時器的最長定時時間超過了1小時,並且不能主動打斷。如果等定時器到期,程式退出需要很長時間。

而實現上,程式退出是可以打斷定時器,讓定時器回到callback的。如果定時器被程式退出打斷,get_state()會得到乙個wft_state_aborted狀態。

當然如果定時器被程式退出打斷,則不能再調起新的任務。

以下這個程式,每間隔一秒抓取乙個乙個http頁面。當所有url抓完畢,程式直接退出,不用等待timer回到callback,退出不會有延遲。

bool

program_terminate = false;

void timer_callback(wftimertask

*timer)

series_of(timer)->push_back(wftaskfactory::create_timer_task(1000000,

timer_callback));

}mutex.unlock();

}...

int main()

以上程式,timer_callback必須在鎖裡判斷program_terminate條件,否則可能在程式已經結束的情況下又調起新任務。 由於使用上有一定難度,程式應該盡量避免使用這個特徵,而應該等所有定時器都回到callback,再結束程式。

定時時間不夠用怎麼辦

目前定時器最長定時用期約4200秒,如果程式的任務為24小時啟動一次,則需要乙個24小時的定時。可以簡單地新增多個定時器。

例如:void timer_callback(wftimertask

*timer)

void my_callback(wfmytask *task)

wfmytask *next_task = myfactory::create_my_task(...,

my_callback);

series->push_back(next_task);

}因為timer_task是一種耗費資源非常小的任務,所以可以建立非常多的timer。上例中建立24個1小時的定時器,每24小時執行乙個任務。

例子中也考慮了程式隨時可以退出的問題。在timer的callback裡發現程式已經退出,需要cancel餘下的任務。

雖然我們的定時器可以被程式退出中斷,而且我們也支援把多個定時器串起來,實現乙個很長的定時, 但這都不是我們推薦的做法。大多數情況下應該避免太長時間的定時,並且應該等所有定時器到期再結束程式。

Timer定時器開發

timer定時器開發 定時器的作用是不佔執行緒的等待乙個確定時間,同樣通過callback來通知定時器到期。參考 定時器的建立 同樣是在wftaskfactory類裡的方法 using timer callback t std function class wftaskfactory static ...

timer定時器中斷

注意 tcmpbn的值用於脈衝寬度調製 pwm 當遞減計數器值與定時器控制邏輯中比較暫存器的值匹配時,定時器控制邏輯將更改輸出電平。因此,比較暫存器確定pwm輸出的開啟時間 或關閉時間 此時不會產生定時器中斷,只會使得輸出電平發生反轉。1 定時器具有tcntbn,tcntn,tcmpbn和tcmpn...

Android開發定時器 Timer 的使用

方式1 執行單一定時器任務 timer timer newtimer timer.schedule new timertask 2000 方式2 執行多個定時器任務來實現recycleview的批量更新現在如下圖所示,需要每隔三秒鐘重新整理recycleview裡面的資料,並且是每次只重新整理三個條...