2014-04-21 3 views
25

Ich habe eine Baumansicht mit einem Baumspeicher als Modell erstellt. Das Fenster wird wie erwartet showd, aber wenn ich in der „+“ klicken, um die Elemente zu erweitern ich diese Meldung:GLib-CRITICAL **: Quell-ID XXX wurde beim Versuch, sie zu entfernen, nicht gefunden

Glib-KRITISCH **: Source ID 221 wurde nicht gefunden, wenn man versucht, es zu entfernen

Hier ist mein Code:

#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; 
} 

Irgendwelche Ideen?

+1

Haben Sie versucht, gdb zu verwenden? strate? Edit: Ich habe es gerade ausgeführt und ich bekomme _not_ keine Warnung oder Fehler. gtk + -2.0 ist 2.24.22, wird auf Fedora 20 x86_64 – drahnr

+0

Ich bekomme auch keine Warnungen. Sind Sie sicher, dass das Problem tatsächlich mit dem Code der Frage reproduziert werden kann? – user4815162342

+0

Ja, das ist der Lochcode, und nach ran gdb, zeigt den gleichen Fehler, und mit "where" -Befehl gibt es "no stack" zurück; Ich benutze Archlinux mit gtk + -2.0 2.24.23-1 :( – Joel

Antwort

41

Dies ist kein Fehler in Ihrem Code und auch kein Absturz. Es ist nur eine Warnung, dass g_source_remove() aufgerufen wurde, um einen bestimmten Ereignishandler zu trennen, der bereits getrennt wurde, in diesem Fall in Code, der Teil von GTK ist.

Die Warnung selbst wurde in glib 2.39, in this commit eingeführt, und es scheint, dass nur arch linux-Benutzer davon betroffen sind, weil andere Distributionen noch nicht aktualisiert wurden.

In den meisten Fällen ist dies völlig harmlos und nur ein Ärgernis. Könnte einen Blick wert sein, wenn es mit einem g_source_remove() Aufruf in Ihrem eigenen Code stammt.

einen Haltepunkt auf g_log Stellen zu finden, was es verursacht:

(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() 

Der Backtrace den ganzen Weg von gtk_main geht ohne Übergang ein einziges Mal durch den Code g_log, so betrifft dies wahrscheinlich jedes gtk-Programm mit einem Baumsicht.

+1

Es ist in der Ubuntu-Bug-Liste aufgeführt https://bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/1264368 und immer noch nicht behoben –

+0

auf debian (Kernel [-Linux 3.19.0-2.slh.1-aptosid-amd64 x86_64-]) es zeigt sich auch mit gdb und lazarus/haptrc –

+0

FYI, es passiert auch auf Windows (WinXP, Win7, 32/64), zumindest für einige unserer Gtk-Apps (erstellt mit MingW/DLLs etc) ... nicht nur unter Linux, es scheint ... aber vielen Dank für die Erklärung. – DrOli

Verwandte Themen