timer定時器開發
定時器的作用是不佔執行緒的等待乙個確定時間,同樣通過callback來通知定時器到期。
參考:定時器的建立
同樣是在wftaskfactory類裡的方法:
using timer_callback_t =
std::function;
class wftaskfactory
static wftimertask *create_timer_task(unsigned int microseconds,
timer_callback_t callback);
第乙個引數為定時時間,單位為微秒。除了程式退出,定時器不可以提前結束。
定時器任務裡同樣有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)
mutex.lock();
if
(!program_terminate)
series_of(timer)->push_back(wftaskfactory::create_timer_task(1000000,
timer_callback));
}
mutex.unlock();
int main()
....
/* all urls done */
mutex.lock();
program_terminate = true;
mutex.unlock();
return 0;
以上程式,timer_callback必須在鎖裡判斷program_terminate條件,否則可能在程式已經結束的情況下又調起新任務。 由於使用上有一定難度,程式應該盡量避免使用這個特徵,而應該等所有定時器都回到callback,再結束程式。
定時時間不夠用怎麼辦
目前定時器最長定時用期約4200秒,如果程式的任務為24小時啟動一次,則需要乙個24小時的定時。可以簡單地新增多個定時器。
例如:void timer_callback(wftimertask
*timer)
mutex.lock();
if (program_terminate)
series_of(timer)->cancel();
mutex.unlock();
void my_callback(wfmytask *task)
serieswork *series = series_of(task);
wftimertask *timer;
for (int i = 0; i < 24; i++)
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 第乙個引數為定...
timer定時器中斷
注意 tcmpbn的值用於脈衝寬度調製 pwm 當遞減計數器值與定時器控制邏輯中比較暫存器的值匹配時,定時器控制邏輯將更改輸出電平。因此,比較暫存器確定pwm輸出的開啟時間 或關閉時間 此時不會產生定時器中斷,只會使得輸出電平發生反轉。1 定時器具有tcntbn,tcntn,tcmpbn和tcmpn...
Android開發定時器 Timer 的使用
方式1 執行單一定時器任務 timer timer newtimer timer.schedule new timertask 2000 方式2 執行多個定時器任務來實現recycleview的批量更新現在如下圖所示,需要每隔三秒鐘重新整理recycleview裡面的資料,並且是每次只重新整理三個條...