3

我正在尝试添加特定于特定 GThread 的超时源。

在主线程中,我可以创建一个 GMainContext ( g_main_context_new ) 并添加一个超时 ( g_timeout_add )。但是,当我尝试在使用g_thread_create创建的线程中执行此操作时,它根本不起作用,GSourceFunc 永远不会被调用,我不知道为什么。

目前我只有这个文档:

回调需要一些注意。来自 GTK+(信号)的回调是在 GTK+ 锁内进行的。然而,来自 GLib 的回调(超时、IO 回调和空闲函数)是在 GTK+ 锁之外进行的。因此,在信号处理程序中您不需要调用 gdk_threads_enter(),但在其他类型的回调中,您可以这样做。

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

线程结构为:

主线程 --> 没有显式创建 GLib 主上下文

  • 捕获线程

  • 进程线程 --> 应该有一个 GLib 主上下文和一个超时源

  • 显示线程

我很感激任何帮助。

提前致谢。

4

1 回答 1

1

你用g_timeout_add()org_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;
}
于 2012-08-04T16:13:34.447 回答