GLib-CRITICAL **: идентификатор источника XXX не был найден при попытке его удаления.

Я сделал древовидное представление с хранилищем деревьев в качестве модели. Окно отображается, как и ожидалось, но когда я нажимаю «+», чтобы развернуть элементы, я получаю это сообщение:

GLib-CRITICAL **: Source ID 221 was not found when attempting to remove it

Вот мой код:

#include <gtk/gtk.h>

/* compile with: */
/* gcc main.c -o boxy `pkg-config --cflags --libs gtk+-2.0` */

typedef struct {
GtkWidget *toplevel;
GtkWidget *treeview;
} Widgets;

enum { ITEM_PARENT, ITEM_CHILD };

typedef struct {
gint tipo;
gint id;
gchar *nombre;
gint cantidad;
} Lista;

void addColumn (GtkTreeView *tv, const gchar* title, gint pos) {
GtkCellRenderer *tmp;
tmp = gtk_cell_renderer_text_new ();
g_object_set (tmp, "editable", TRUE, "editable-set", TRUE, NULL);
gtk_tree_view_insert_column_with_attributes (tv, -1, title, tmp, "text", pos, NULL);
}

void setupTree (GtkTreeView *tv) {
const Lista lista[] = {
    {ITEM_PARENT, 125, "Superman", 2},
    {ITEM_CHILD, 23, "Batman", 1},
    {ITEM_CHILD, 7, "Hulk", 5},
    {ITEM_PARENT, 65, "Iron Man", 2},
    {-1, -1, NULL, -1}
};
GtkTreeStore *model;
GtkTreeIter last;
gint pos;
model = gtk_tree_store_new (3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT);
addColumn (tv, "ID", 0);
addColumn (tv, "Nombre", 1);
addColumn (tv, "Cantidad", 2);
for (pos = 0; lista[pos].tipo != -1; pos++) {
    GtkTreeIter iter;
    if (lista[pos].tipo == ITEM_PARENT) {
        gtk_tree_store_append (model, &iter, NULL);
        last = iter;
    } else if (lista[pos].tipo == ITEM_CHILD) {
        gtk_tree_store_append (model, &iter, &last);
    }
    gtk_tree_store_set (model, &iter, 0, lista[pos].id, 1, lista[pos].nombre, 2, lista[pos].cantidad, -1);
}
gtk_tree_view_set_model (tv, GTK_TREE_MODEL (model));
g_object_unref (model);
}

int main (int argc, char *argv[]) {
Widgets *ptr;
GtkWidget *scroll;
gtk_init (&argc, &argv);
ptr = g_slice_new0(Widgets);
ptr->toplevel = gtk_window_new (GTK_WINDOW_TOPLEVEL);
scroll = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_OUT);
ptr->treeview = gtk_tree_view_new ();
setupTree (GTK_TREE_VIEW (ptr->treeview));

g_signal_connect (ptr->toplevel, "destroy", G_CALLBACK (gtk_main_quit), NULL);

gtk_container_set_border_width (GTK_CONTAINER (ptr->toplevel), 10);
gtk_container_add (GTK_CONTAINER (scroll), ptr->treeview);
gtk_container_add (GTK_CONTAINER (ptr->toplevel), scroll);
gtk_widget_show_all (ptr->toplevel);
gtk_main ();
g_slice_free (Widgets, ptr);
return 0;
}

Есть идеи?


person Joel    schedule 21.04.2014    source источник
comment
Вы пытались использовать gdb? стрейс? Редактировать: только что запустил его, и я не получаю никаких предупреждений или ошибок. gtk+-2.0 это 2.24.22, на Fedora 20 x86_64   -  person drahnr    schedule 22.04.2014
comment
Я тоже не получаю никаких предупреждений. Вы уверены, что проблема действительно воспроизводится с кодом из вопроса?   -  person user4815162342    schedule 22.04.2014
comment
Да, это код дыры, и после запуска gdb выводит ту же ошибку, а с командой where он не возвращает стека; Я использую Archlinux с gtk+-2.0 2.24.23-1 :(   -  person Joel    schedule 22.04.2014
comment
Скомпилируйте его с -ggdb и используйте bt после сбоя. Опубликуйте полный бэктрейс.   -  person drahnr    schedule 26.04.2014
comment
Я использую DDD, и это появилось в окне обратной трассировки: postimg.org/image/rfv1nl66l   -  person Joel    schedule 27.04.2014


Ответы (1)


Это не ошибка в вашем коде и не сбой. На самом деле это просто предупреждение о том, что g_source_remove() было вызвано для отключения определенного обработчика событий, который уже был отключен, в данном случае, в коде, являющемся частью gtk.

Само предупреждение появилось в glib 2.39, в этом коммите, и похоже, что это только для арч-линукса. пользователи затронуты этим, потому что другие дистрибутивы еще не обновились.

В большинстве случаев это совершенно безвредно и вызывает только раздражение. Возможно, стоит посмотреть, если это происходит с вызовом g_source_remove() в вашем собственном коде.

Установите точку останова в g_log, чтобы найти причину:

(gdb) break g_log
Breakpoint 1 at 0x7ffff5ea5a70
(gdb) c
Continuing.

Breakpoint 1, 0x00007ffff5ea5a70 in g_log () from /usr/lib/libglib-2.0.so.0
(gdb) bt
#0  0x00007ffff5ea5a70 in g_log () from /usr/lib/libglib-2.0.so.0
#1  0x00007ffff5e9d9dc in g_source_remove () from /usr/lib/libglib-2.0.so.0
#2  0x00007ffff79bd0f5 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#3  0x00007ffff79cc1a4 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#4  0x00007ffff79cda66 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#5  0x00007ffff78d7435 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#6  0x00007ffff616e3d8 in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#7  0x00007ffff617fb1b in ?? () from /usr/lib/libgobject-2.0.so.0
#8  0x00007ffff6187719 in g_signal_emit_valist () from /usr/lib/libgobject-2.0.so.0
#9  0x00007ffff6187d02 in g_signal_emit () from /usr/lib/libgobject-2.0.so.0
#10 0x00007ffff79e6fe4 in ?? () from /usr/lib/libgtk-x11-2.0.so.0
#11 0x00007ffff78d5be4 in gtk_propagate_event () from /usr/lib/libgtk-x11-2.0.so.0
#12 0x00007ffff78d5f9b in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#13 0x00007ffff75519cc in ?? () from /usr/lib/libgdk-x11-2.0.so.0
#14 0x00007ffff5e9eb84 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0
#15 0x00007ffff5e9edc8 in ?? () from /usr/lib/libglib-2.0.so.0
#16 0x00007ffff5e9f08a in g_main_loop_run () from /usr/lib/libglib-2.0.so.0
#17 0x00007ffff78d5087 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#18 0x000000000040152f in main ()

Обратная трассировка проходит весь путь от gtk_main до g_log, не проходя ни разу через ваш код, так что это, вероятно, влияет на любую программу gtk с древовидной структурой.

person dequis    schedule 05.06.2014
comment
Он указан в списке ошибок Ubuntu bugs.launchpad.net /ubuntu/+source/gnome-control-center/+bug/ и до сих пор не исправлено - person Paul Gregoire; 20.03.2015
comment
в debian (Kernel[-Linux 3.19.0-2.slh.1-aptosid-amd64 x86_64-]) он тоже появляется с gdb и lazarus/heaptrc - person hy-soft; 01.04.2015
comment
К вашему сведению, это происходит и в Windows (WinXP, Win7, 32/64), по крайней мере, для некоторых наших приложений Gtk (созданных с помощью MingW/DLL и т. д.)... не только в Linux, кажется... но большое спасибо за объяснение. - person DrOli; 20.11.2016