Hi all, excuse me for my obstinacy, but it is fundamental for my application. I wrote on 20. June that I have a problem with memory usage of gtk_model/view, but nobody take notice from this. Here is a new running. We have an application whith GTK+2.0 and using gtk_tree_view and gtk_list_model. Because we wont to show records from the database, it is possible that there can be more then 10000 record. The problem is, after every filling/clearing the model/view the usage memory is continue growing up. And after N fillings/clearing the app crash because there is now more memory in the system. I use linux rh 7.2 with 2.4.16 Kernel and gtk+-2.0.5 To find the failure I took a demo and modify the source, so you can see, how we fill and clear the model. What must we do to clear all memory when we fill the modell new. I put the sources of the test and the results in this message: Tanks for your help. bernd
Attachment:
ergebnisse.gnumeric
Description: Memory usage after filling/clear
#include <gtk/gtk.h> typedef struct { const gchar *string; gboolean is_editable; } ListEntry; enum { STRING_COLUMN, IS_EDITABLE_COLUMN, NUM_COLUMNS }; static ListEntry model_strings[] = { {" %d \t A simple string", TRUE }, {" %d \t Another string!", TRUE }, {" %d \t Guess what, a third string. This one can't be edited", FALSE }, {" %d \t And then a fourth string. Neither can this", FALSE }, {" %d \t Multiline\nFun!", TRUE }, { NULL } }; static GtkTreeModel * create_model (void) { GtkListStore *model; model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN); g_print("After Create Modell\n"); g_mem_profile(); return GTK_TREE_MODEL (model); } /* Our usual callback function */ void fuelle( GtkWidget *widget, gpointer treemodel ) { static int zaehler = 1; gint i,j; GtkTreeIter iter; char puffer[256]; for (j=0; j < 1000; j++){ for (i = 0; model_strings[i].string != NULL; i++) { gtk_list_store_append (treemodel, &iter); sprintf(puffer, model_strings[i].string, j*100+i); gtk_list_store_set (treemodel, &iter, STRING_COLUMN, puffer, IS_EDITABLE_COLUMN, model_strings[i].is_editable, -1); } } g_print("After %d. Fill Modell\n", zaehler++); g_mem_profile(); } /* Our usual callback function */ void leere( GtkWidget *widget, gpointer treemodel ) { static int zaehler = 1; gtk_list_store_clear (treemodel); g_print("After %d. Clear Modell\n", zaehler++); g_mem_profile(); } gint main (gint argc, gchar **argv) { GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *tree_view; GtkWidget *button1; GtkWidget *box; GtkWidget *bb; GtkWidget *button2; GtkTreeModel *tree_model; GtkCellRenderer *renderer; g_mem_set_vtable(glib_mem_profiler_table); gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GtkTreeView editing sample"); gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL); /* Create box */ box = gtk_vbox_new (FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (box), 2); gtk_box_set_homogeneous(GTK_BOX(box), FALSE); gtk_container_add (GTK_CONTAINER (window), box); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add (GTK_CONTAINER (box), scrolled_window); tree_model = create_model (); tree_view = gtk_tree_view_new_with_model (tree_model); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), TRUE); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), -1, "String", renderer, "text", STRING_COLUMN, "editable", IS_EDITABLE_COLUMN, NULL); bb = gtk_hbutton_box_new(); gtk_container_add (GTK_CONTAINER (box), bb); /* Create a new button */ button1 = gtk_button_new_with_label ("Fuelle"); /* Connect the "clicked" signal of the button to our callback */ g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (fuelle), (gpointer) tree_model); gtk_container_add (GTK_CONTAINER (bb), button1); /* Create a new button */ button2 = gtk_button_new_with_label ("Leere"); /* Connect the "clicked" signal of the button to our callback */ g_signal_connect (G_OBJECT (button2), "clicked", G_CALLBACK (leere), (gpointer) tree_model); gtk_container_add (GTK_CONTAINER (bb), button2); renderer = gtk_cell_renderer_toggle_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), -1, "Editable", renderer, "active", IS_EDITABLE_COLUMN, NULL); gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view); gtk_window_set_default_size (GTK_WINDOW (window), 650, 400); gtk_widget_show_all (window); gtk_main (); return 0; }