Re: timeout function not called



On Tue, 2007-10-02 at 10:51 -0400, tsangv gdls com wrote:

I'm still muddling my way through my first GTK application (and I'm a 
relative newbie on all software matters).

I have the following in one of my callbacks:

timer = g_timout_add(50, (GSourceFunc) progress_update, 
(gpointer)progressbar);

pid = fork( );

if (pid == 0)
{
     growPart ( );
     exit(0);
}
ret = wait(NULL);

g_source_remove(timer);

---------------

where progress_update is:

static gboolean progress_update (gpointer progressbar)
{
   gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progressbar));
   return true;
}

----------------

I was hoping that this would mean that the progress bar would pulse while 
growPart() was running, but instead it waits until after (is this because 
control hasn't been returned to gtk_main yet?) at which point it is 
removed. If I take out the g_source_remove it runs beautifully....but only 
after growPart has completed. How can I get around this?

Thanks so much



The use of FORK is a little odd, I don't think  I've seen that used in a
GTK program before.  The ret=wait(null) causes execution to stop at that
point and wait for growPart() to finish.  A way to get around the
logistics of fork() is to use threads directly.  Consider the following;

/* globals */
gboolean  b_pulse_control = FALSE
GThread  *grow_thread_id = NULL;
gint   global_ret = 0;


b_pulse_control = TRUE;
timer = g_timeout_add(50, (GSourceFunc) progress_update,
(gpointer)progressbar);

grow_thread_id = g_thread_create ( growPart_thread, &b_pulse_control,
TRUE, NULL);


static gboolean progress_update (gpointer progressbar)
{
     if (b_pulse_control)
    {
         gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progressbar));
         return true;
    } else {
        global_ret = GPOINTER_TO_INT( g_thread_join (grow_thread)  );
        return FALSE;
    }

}

static gpointer growPart_thread(gpointer b_pulse)
{

     /* do work */
     growPart();

     *b_pulse = FALSE;
     g_thread_exit( GINT_TO_POINTER( 1 ) );

}

I would do the passing of control values via a structure to avoid the use of globals, but this should work 
for you.

James,



This is an e-mail from General Dynamics Land Systems. It is for the intended recipient only and may contain 
confidential and privileged information.  No one else may read, print, store, copy, forward or act in 
reliance on it or its attachments.  If you are not the intended recipient, please return this message to 
the sender and delete the message and any attachments from your computer. Your cooperation is appreciated.

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]