g_timeout_add一个g线程内(g_timeout_add inside a GThread

2019-09-18 22:32发布

我试图添加针对特定的g线程超时来源。

在主线程,我可以创造一个GMainContext(g_main_context_new),并添加超时(g_timeout_add)。 然而,当我尝试做与g_thread_create它根本不起作用创建一个线程,该GSourceFunc不会被调用,我不知道为什么。

目前我只带了这个文档:

回调需要一些关注。 从GTK +(信号)回调的GTK +锁之内。 然而从GLib的(超时,IO回调和空闲函数)回调的GTK +锁以外制成。 因此,信号处理程序中不需要调用gdk_threads_enter(),但其他类型的回调中,你怎么做。

但我的超时功能(用于测试目的)仅在控制台打印,所以我不认为这是资源保护和互斥的问题。

螺纹结构是:

主线程 - >无GLib的主要方面明确创建

  • 捕获线程

  • 进程线程 - >应具有GLib的主上下文和超时源

  • 显示螺纹

我感谢所有帮助。

提前致谢。

Answer 1:

您是否使用g_timeout_add()g_source_attach()

g_timeout_add()g_timeout_add_full()不允许您指定的主要方面的补充。 它总是使用默认的主要方面。 如果你不使用你的主线程默认的主背景下,完全可以在你使用它process thread 。 你可以在阅读关于它的描述 。

一个GMainContext只能在一个线程中运行

默认的主上下文隐含的许多功能,包括创建g_main_context_default() 所以请确保您有没有在你的主线程使用它。

您可以使用g_source_attach()的超时源添加到自己的主背景下,如果你决定这样做。 还有就是你可以用它来指定您的主要方面没有超时功能。 所以,仅仅靠你自己去做。

以下代码是作为基本上相同: g_timeout_add_full(G_PRIORITY_DEFAULT, 100, func, l, notify);

#include <glib.h>

void notify(gpointer data)
{
        g_main_loop_quit((GMainLoop *)data);
}

gboolean func(gpointer data)
{
        static gint i = 0;
        g_message("%d", i++);
        return (i < 10) ? TRUE : FALSE;
}

gpointer thread(gpointer data)
{
        GMainContext *c;
        GMainContext *d;
        GMainLoop *l;
        GSource *s;

        c = g_main_context_new();
        d = g_main_context_default();

        g_message("local: %p", c);
        g_message("default: %p", d);

#if 1
        l = g_main_loop_new(c, FALSE);
        s = g_timeout_source_new(100);
        g_source_set_callback(s, func, l, notify);
        g_source_attach(s, c);
        g_source_unref(s);
#else
        l = g_main_loop_new(d, FALSE);
        g_timeout_add_full(G_PRIORITY_DEFAULT, 100, func, l, notify);
#endif

        g_main_loop_run(l);
        g_message("done");

        return NULL;
}

int main(int argc, char *argv[])
{
        GError *error = NULL;
        GThread *t;

        g_thread_init(NULL);
        t = g_thread_create(thread, NULL, TRUE, &error);
        g_thread_join(t);

        return 0;
}


文章来源: g_timeout_add inside a GThread