Libuv uv_timer_t 學習筆記

官方程序代碼

#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;
}

說明幾個重要的地方

  1. uv_unref((uv_handle_t*) &gc_req);
    這個函數的意思是,如果除了定時器 gc_req, 如果當前沒有其他任務的時候,則退出定時器 gc_req,當前這個例子中,如果不加這條指令,則這個程序會永無休止的運行下去,但是現在加了這條,因爲 fake_job_req 這個定時只會在啓動時執行一次,那麼程序就會在 fake_job_req 執行完這一次後,就會釋放 gc_req ,程序退出。
  2. int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle)
    初始化 定時器句柄
  3. 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 這個參數是指定,定時器循環定時的時間,也就是重複調用的時間,單位是毫秒。
  4. 測試截圖
    加了 uv_unref((uv_handle_t*) &gc_req); 時,程序運行結果,程序會在 fake_job_req 結束後退出(也就是空閒的時候會退出)。
    測試截圖加了 uv_unref((uv_handle_t*) &gc_req); 時,程序運行結果
    取消uv_unref((uv_handle_t*) &gc_req); 時,程序運行結果,程序會一直運行下去。
    在這裏插入圖片描述

關於 uv_timer_t 其他幾個函數

  1. int uv_timer_stop(uv_timer_t* handle)
    停止定時器,執行後就不再會調用定時器回調函數了。
  2. int uv_timer_again(uv_timer_t* handle)
    停止定時器後,如果你想從新啓動定時器,調用這個函數就可以了。
  3. 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 後纔會調用回調函數。
  4. uint64_t uv_timer_get_repeat(const uv_timer_t* handle)
    獲取定時器,循環調用時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章