Re: timeout function not called
- From: James Scott Jr <skoona verizon net>
- To: tsangv gdls com
- Cc: gtk-app-devel-list gnome org
- Subject: Re: timeout function not called
- Date: Thu, 04 Oct 2007 00:02:13 -0400
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]