事件循环

#include <glib.h>
#include <stdio.h>

/* timeout functions */
gboolean count_down(gpointer data);
gboolean cancel_fire(gpointer data);

/* idle functions */
gboolean say_idle(gpointer data);

int main(int argc, char *argv[]) {
    /* GMainLoop 表示一个主事件循环,由g_main_loop_new 创建
     * 第一个参数为 GMainContext,为 NULL 表示默认 GMainContext
     */
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);

    /* 添加超时事件源 */
    g_timeout_add(500, count_down, NULL);
    g_timeout_add(8000, cancel_fire, loop);

    /* 添加空闲函数,当没有更高优先级的事件时,
     * 空闲函数就会被执行
     */
    // g_idle_add(say_idle, NULL);

    /* 该函数将不停地检查事件源中是否有新事件进行分发
     *
     * 在某事件处理函数中调用 g_main_loop_quit 将导致
     * 该函数退出
     */
    g_main_loop_run(loop);

    /* 减少 loop 引用计数,如果引用计数为 0,释放 loop */
    g_main_loop_unref(loop);

    return 0;
}

/* 超时事件处理函数
 *
 * 该函数会重复运行直到返回 FALSE,
 * 与此同时,定时器被销毁
 */
gboolean count_down(gpointer data) {
    static int counter = 10;

    if (counter < 1) {
        printf("-----[FIRE]-----\n");

        /* 定时器被销毁,count_down 不会被再次运行 */
        return FALSE;
    }

    printf("-----[% 4d]-----\n", counter--);

    /* count_down 在发生下次超时事件时运行 */
    return TRUE;
}

/* 超时事件处理函数 */
gboolean cancel_fire(gpointer data) {
    GMainLoop *loop = data;

    printf("-----[QUIT]-----\n");
    /* 退出主循环,g_main_loop_run 返回 */
    g_main_loop_quit(loop);

    return FALSE;
}

/* 空闲函数
 *
 * 如果该函数返回 FALSE,该事件源将被删除,该函数不会再次运行
 */
gboolean say_idle(gpointer data) {
    printf("-----[IDLE]-----\n");

    /* 如果该函数返回 FALSE,该事件源将被删除,
     * 该函数不会再次运行
     */
    return FALSE;

    /* 如果该函数返回 TRUE
     * 该函数会在没有更高优先级的事件时,再次运行
     */
    // return TRUE;
}
zood