我对GMainLoop工作方式有一些误解.主要的东西 - 添加一些回调的API g_main_loop(比如g_timeout_add_seconds())不会指向你想要添加回调的循环.
看起来您为所有g_main_loop实例添加了回调.即使你还没有创建.简单的例子:
#include <glib.h>
gboolean callback(gpointer data)
{
static guint16 i=0;
g_print("Iter=%"G_GUINT16_FORMAT"\n",i++);
if(i%5==0){
g_print("try to stop loop1\n");
g_main_loop_quit((GMainLoop*)data);
}
return TRUE;
}
int main()
{
GMainLoop* loop1 = NULL;
GMainLoop* loop2 = NULL;
loop1 = g_main_loop_new (NULL, FALSE);
g_timeout_add_seconds(1, callback,loop1);
loop2 = g_main_loop_new (NULL, FALSE);
g_print("run loop1\n");
g_main_loop_run(loop1);
g_free(loop1);
g_print("run loop2\n");
g_main_loop_run(loop2);
g_free(loop2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
run loop1
Iter=0
Iter=1
Iter=2
Iter=3
Iter=4
try to stop loop1
run loop2
Iter=5
Iter=6
Iter=7
Iter=8
Iter=9
try to stop loop1
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
是否有可能加入callback()到loop1了,不把它添加到loop2?
nem*_*equ 11
快速浏览一下该文件g_idle_add(),g_idle_add_full(),g_timeout_add(),或者g_timeout_add_full()会告诉你:
这在内部创建一个主循环源,使用
g_timeout_source_new()它并将其附加到主循环上下文g_source_attach().如果需要更好的控制,可以手动执行这些步骤.
请注意,它表示它将源附加到主循环上下文 - 即 a GMainContext,而不是a GMainLoop.当您创建GMainLoop实例时,您将传递NULL第一个参数.根据the g_main_loop_new() documentation,这个论点是
a
GMainContext(如果NULL使用默认上下文).
因此,您将创建两个主循环,两个都使用相同的上下文(这是默认上下文).
为了得到我认为你期待的结果,你应该做的事情如下:
#include <glib.h>
gboolean callback(gpointer data)
{
static guint16 i=0;
g_print("Iter=%"G_GUINT16_FORMAT"\n",i++);
if(i%5==0){
g_print("try to stop loop1\n", data);
g_main_loop_quit((GMainLoop*)data);
}
return TRUE;
}
int main()
{
GMainContext* con1 = NULL;
GMainContext* con2 = NULL;
GMainLoop* loop1 = NULL;
GMainLoop* loop2 = NULL;
GSource* source1 = NULL;
con1 = g_main_context_new ();
con2 = g_main_context_new ();
loop1 = g_main_loop_new (con1, FALSE);
loop2 = g_main_loop_new (con2, FALSE);
source1 = g_timeout_source_new_seconds (1);
g_source_set_callback (source1, callback, loop1, NULL);
g_source_attach (source1, con1);
// We don't need the GMainContext anymore—the loop has an internal
// reference so we'll drop ours.
g_main_context_unref (con1);
con1 = NULL;
// Ditto for the GSource
g_source_unref (source1);
source1 = NULL;
g_main_context_unref (con2);
con2 = NULL;
g_print("run loop1\n");
g_main_loop_run(loop1);
// Use g_main_loop_unref, not g_free
g_main_loop_unref(loop1);
loop1 = NULL;
g_print("run loop2\n");
// Note that there is no longer a callback attached here, so it will
// run forever.
g_main_loop_run(loop2);
g_main_loop_unref(loop2);
loop2 = NULL;
return 0;
}
Run Code Online (Sandbox Code Playgroud)