日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Timer定时器开发

發(fā)布時(shí)間:2023/11/28 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Timer定时器开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Timer定時(shí)器開發(fā)

定時(shí)器的作用是不占線程的等待一個(gè)確定時(shí)間,同樣通過callback來通知定時(shí)器到期。

參考:https://github.com/sogou/workflow

定時(shí)器的創(chuàng)建

同樣是在WFTaskFactory類里的方法:

using timer_callback_t =
std::function<void (WFTimerTask*)>;

class WFTaskFactory

{

static WFTimerTask *create_timer_task(unsigned int microseconds,timer_callback_t callback);

};

第一個(gè)參數(shù)為定時(shí)時(shí)間,單位為微秒。除了程序退出,定時(shí)器不可以提前結(jié)束。

定時(shí)器任務(wù)里同樣有user_data域可以用來傳遞一些用戶數(shù)據(jù)。啟動方法和接入任務(wù)流的方法與其它任務(wù)沒有區(qū)別。

定時(shí)器的一個(gè)高級特征

在關(guān)于程序退出里講到,main函數(shù)結(jié)束或exit()被調(diào)用的時(shí)候,所有任務(wù)必須里運(yùn)行到callback,并且沒有新的任務(wù)被調(diào)起。

這們就可能出現(xiàn)一個(gè)問題,定時(shí)器的最長定時(shí)時(shí)間超過了1小時(shí),并且不能主動打斷。如果等定時(shí)器到期,程序退出需要很長時(shí)間。

而實(shí)現(xiàn)上,程序退出是可以打斷定時(shí)器,讓定時(shí)器回到callback的。如果定時(shí)器被程序退出打斷,get_state()會得到一個(gè)WFT_STATE_ABORTED狀態(tài)。

當(dāng)然如果定時(shí)器被程序退出打斷,則不能再調(diào)起新的任務(wù)。

以下這個(gè)程序,每間隔一秒抓取一個(gè)一個(gè)http頁面。當(dāng)所有url抓完畢,程序直接退出,不用等待timer回到callback,退出不會有延遲。

bool
program_terminate = false;

void timer_callback(WFTimerTask
*timer)

{

mutex.lock();if

(!program_terminate)

{WFHttpTask *task;if (urls_to_fetch
    {task = WFTaskFactory::create_http_task(...);series_of(timer)->push_back(task);}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條件,否則可能在程序已經(jīng)結(jié)束的情況下又調(diào)起新任務(wù)。 由于使用上有一定難度,程序應(yīng)該盡量避免使用這個(gè)特征,而應(yīng)該等所有定時(shí)器都回到callback,再結(jié)束程序。

定時(shí)時(shí)間不夠用怎么辦

目前定時(shí)器最長定時(shí)用期約4200秒,如果程序的任務(wù)為24小時(shí)啟動一次,則需要一個(gè)24小時(shí)的定時(shí)。可以簡單地添加多個(gè)定時(shí)器。

例如:

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++){timer = WFTaskFactory::create_timer_task(3600U*1000*1000,

timer_callback);

    series->push_back(timer);}WFMyTask *next_task = MyFactory::create_my_task(...,

my_callback);

series->push_back(next_task);

}

因?yàn)閠imer_task是一種耗費(fèi)資源非常小的任務(wù),所以可以創(chuàng)建非常多的timer。上例中創(chuàng)建24個(gè)1小時(shí)的定時(shí)器,每24小時(shí)執(zhí)行一個(gè)任務(wù)。

例子中也考慮了程序隨時(shí)可以退出的問題。在timer的callback里發(fā)現(xiàn)程序已經(jīng)退出,需要cancel余下的任務(wù)。

雖然我們的定時(shí)器可以被程序退出中斷,而且我們也支持把多個(gè)定時(shí)器串起來,實(shí)現(xiàn)一個(gè)很長的定時(shí), 但這都不是我們推薦的做法。大多數(shù)情況下應(yīng)該避免太長時(shí)間的定時(shí),并且應(yīng)該等所有定時(shí)器到期再結(jié)束程序。

總結(jié)

以上是生活随笔為你收集整理的Timer定时器开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。