Я немного не понимаю, как работает 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 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)
Можно ли добавить callback()
к loop1
и не добавлять к loop2
?