官方程序代碼
#include <stdio.h>
#include <uv.h>
uv_loop_t *loop;
uv_timer_t gc_req;
uv_timer_t fake_job_req;
void gc(uv_timer_t *handle) {
fprintf(stderr, "Freeing unused objects\n");
}
void fake_job(uv_timer_t *handle) {
fprintf(stdout, "Fake job done\n");
}
int main() {
loop = uv_default_loop(); // 定義並初始化一個默認的循環
uv_timer_init(loop, &gc_req); // 初始化定時器 gc_req
uv_unref((uv_handle_t*) &gc_req); // 如果沒有其他任務,則釋放 gc_req 定時任務
uv_timer_start(&gc_req, gc, 0, 2000); // 啓動 gc_req 定時器, 0 毫秒開始,每 2000 毫秒執行一次
uv_timer_init(loop, &fake_job_req); // 初始化定時器 fake_job_req
uv_timer_start(&fake_job_req, fake_job, 9000, 0); // 啓動 fake_job_req 定時器, 9000 毫秒後開始執行, 不需要循環執行
uv_run(loop, UV_RUN_DEFAULT); // 運行 loop 循環
return 0;
}
說明幾個重要的地方
- uv_unref((uv_handle_t*) &gc_req);
這個函數的意思是,如果除了定時器 gc_req, 如果當前沒有其他任務的時候,則退出定時器 gc_req,當前這個例子中,如果不加這條指令,則這個程序會永無休止的運行下去,但是現在加了這條,因爲 fake_job_req 這個定時只會在啓動時執行一次,那麼程序就會在 fake_job_req 執行完這一次後,就會釋放 gc_req ,程序退出。 - int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle)
初始化 定時器句柄 - int uv_timer_start(uv_timer_t* handle, uv_timer_cb cb, uint64_t timeout, uint64_t repeat)
這個函數應該稱它爲 設置定時器, 而不是啓動定時器, 因爲定時器運行是從 uv_run() 開始的。
這個函數有 4 個參數:
1. uv_timer_t *handle 定時器句柄,用於保存當前定時器的一個 id,後續可以通過這個 id, 重新配置、重啓、關閉 定時器。
2. uv_timer_cb cb 定時器回調函數指針,定時時間到的時候會調用這個函數,回調函數的格式必須是 void (*uv_timer_cb)(uv_timer_t *handle)
3. uint64_t timeout 這個參數指的是,在 uv_run() 之後多久啓動定時器,單位是毫秒。
4. uint64_t repeat 這個參數是指定,定時器循環定時的時間,也就是重複調用的時間,單位是毫秒。 - 測試截圖
加了 uv_unref((uv_handle_t*) &gc_req); 時,程序運行結果,程序會在 fake_job_req 結束後退出(也就是空閒的時候會退出)。
取消uv_unref((uv_handle_t*) &gc_req); 時,程序運行結果,程序會一直運行下去。
關於 uv_timer_t 其他幾個函數
- int uv_timer_stop(uv_timer_t* handle)
停止定時器,執行後就不再會調用定時器回調函數了。 - int uv_timer_again(uv_timer_t* handle)
停止定時器後,如果你想從新啓動定時器,調用這個函數就可以了。 - void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat)
動態設置定時器,循環調用延時時間。
舉個例子:
如果當前定時的定時時間是 1000ms,如果此時調用 uv_timer_set_repeat(&t1, 100); 設置新的定時時間 100ms, 則定時器會在 100ms 調用回調函數,如果定時器在之前已經運行了 101ms, 則會立即執行,如果定時器之前運行了 50 ms ,則在 50ms 後會調用回調函數,同理將定時器增加到 10000ms uv_timer_set_repeat(&t1, 10000); 如果定時器之前已經運行了 999ms ,則需要在 9001 後纔會調用回調函數。 - uint64_t uv_timer_get_repeat(const uv_timer_t* handle)
獲取定時器,循環調用時間。