polslinux
polslinux

Reputation: 1779

C/GTK+ GTK_IS_PROGESSBAR failed

I have a main.c file where a progress bar is created and then it will be updated by other.c file.
Inside the main.c file i have this:

static void
a_func (    GtkWidget *dialog,
        struct widget_t *Widget,
        gint mode)
{

....
....

Widget->pBar = gtk_progress_bar_new ();

....
....
}

which create and run a dialog. When OK is pushed my_func (Widget); will be called.


Inside the other.c file i have this:

static gboolean
fill (gpointer data)
{
    GtkWidget *bar = data;

    gtk_progress_bar_pulse (GTK_PROGRESS_BAR (bar));

    return TRUE;
}

gint my_func (struct mystruct_t *Widget){

....
....

gtk_progress_bar_pulse (GTK_PROGRESS_BAR (Widget->pBar));

g_timeout_add (100, fill, GTK_PROGRESS_BAR (Widget->pBar));

while (gtk_events_pending ())
   gtk_main_iteration ();

....
....
}

The problem is that i'm getting this error:

GLib-GObject-WARNING **: invalid unclassed pointer in cast to 'GtkProgressBar'

Gtk-CRITICAL **: gtk_progress_bar_pulse: assertion 'GTK_IS_PROGRESS_BAR (pbar)' failed



EDIT 1:
This is a compilable example: https://gist.github.com/polslinux/96e7b18176ac66e50ee1



EDIT 2:
This is a simple workflow graph: http://it.tinypic.com/r/316us0y/8

Upvotes: 0

Views: 544

Answers (1)

drahnr
drahnr

Reputation: 6886

This can not work:

    crypt_file (Widget);
    gtk_widget_destroy (dialog);

You add a GSource to your mainloop which modifies Widget->pBar but you never remove it. On the other hand you destroy the dialog (and thus also pBar itself as it is part of the widget sub-tree) which in turn renders Widget->pBar useless/makes it a dangling pointer.


Things you did not ask for (excuse the direct approach)

  • Your variable names are crappy at best, upper lower case, calling things Widget which are no widgets but mere structs.

  • Make sure you do not split into callbacks and other C functions. That will end up totally messy as your project grows.

  • Try to go for object-orientation. Create a GObject derived klass which handles the mess internally instead of passing translucent structs around.

Upvotes: 1

Related Questions