g_timeout_add 의 경우  g_source_remove 쪽에 문제가 있는 것으로 보인다.


remove - add 반복시 아래 방식이 더 안정적이다. g context 문제가 생길 시에도 바로 확인이 가능하다.


{
    GMainContext *context;
    GMainLoop *main_loop;
    GSource *source;


    /* Initialize thread support */
    g_thread_init(NULL);

    /* Create a GLib Main Context */
    context = g_main_context_new();

    /* Create a Main Loop in the context*/
    main_loop = g_main_loop_new(context,
                                FALSE);

    /* Create new timeout source to be called
     * every 5 seconds.
     * Reference count of source is 1 once created */
    source = g_timeout_source_new(TIMEOUT_MSECS);

    /* Set callback to be called in each timeout */
    g_source_set_callback(source,
                          (GSourceFunc)__timeout_func,
                          main_loop,
                          NULL);

    /* Attach the GSource in the GMainContext.
     * Reference count of source is 2 after this call */
    g_source_attach(source,
                    context);

    /* Run the main loop, until it is stopped */
    g_main_loop_run(main_loop);

    /* We did an attach() with the GSource, so we need to
     * destroy() it */
    g_source_destroy(source);

    /* We need to unref() the GSource to end the last reference
     * we got */
    g_source_unref(source);

    /* The main loop should be destroyed before the context */
    g_main_loop_unref(main_loop);

    /* Finally, destroy the context */
    g_main_context_unref(context);


    /* Done! */

    return 0;
}



http://es.gnu.org/~aleksander/glib/test-gsource.c

+ Recent posts