Re: questionfor progress bar



Adding the work inside the idle function would work, but would be hard
to implement (state is spread out between function calls, so hard to
debug) and not cross-platform, since I think Linux has only recently
added support for AIO (asynchronous input/output). If you'd rather use
threads, here's a small sample that just updates the progress bar; you
would do the rest of the work (such as reading bits of the file)
inside the thread.

#include <gtk/gtk.h>

GtkWidget *bar;

/**
* this function will be run in the *main thread*, i.e.
* from where gtk_main is running
*/

gboolean
update_callback (gpointer data)
{
        gdouble val;

        val = (gdouble) GPOINTER_TO_INT (data) / 1000;

        /* these are needed, read the documentation on gdk_threads_enter */
        gdk_threads_enter ();
        gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (bar), val);
        gdk_threads_leave ();

        return FALSE;
}

gpointer
file_thread (gpointer data)
{
        int    i;
        double val;

        for (i = 0; i < 1000; i++) {
                /* add the idle function. this works from any thread */
                g_idle_add (update_callback, GINT_TO_POINTER (i));
                g_usleep (5000);
        }

        gtk_main_quit ();
}

int
main (int argc, char *argv[])
{
        GtkWidget *window;

        gtk_init (&argc, &argv);

        g_thread_init (NULL);

        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

        bar = gtk_progress_bar_new ();

        gtk_container_add (GTK_CONTAINER (window), bar);

        gtk_widget_show_all (window);

        g_thread_create (file_thread, NULL, TRUE, NULL);

        gtk_main ();
}



Hope that helps!

Samuel Cormier-Iijima

On 11/5/06, Van H Tran <tvhoang1980 yahoo com> wrote:

Hi,

--- Kim Jongha <kim jongha gmail com> wrote:

> /* and the for loop */
>  double val;
>  for(i = 0; i< SOME_NUMBER; i++)
>  {
>    val = (100.0 /SOME_NUMBER)* i /100.0;
>    g_idle_add(show_bar_idle_cb, INT_TO_POINT(val));
>  **SOMEWORK**
>  }
>
> The problem is that timeout events don't occured
> before finishing
> SOMEWORK(read file with fscanf)

How about adding SOMEWORK inside the g_idle_callback
function?

Cheers,
TranVan Hoang
>
> --------------
>  double val = 0;
>    g_idle_add(show_bar_idle_cb, INT_TO_POINT(val));
>  for(i = 0; i< SOME_NUMBER; i++)
>  {
>    val = (100.0 /SOME_NUMBER)* i /100.0;
>  **SOMEWORK**
>  }
> --------------
> upper codes don't work too.
>
> 2006/11/5, Kim Jongha <kim jongha gmail com>:
> > Greeting,
> >
> > progress bar is updated "only" using timeouts ?
> >
> > I read some big file and want to show up the
> progress how much App.
> > read file. so I use progress bar like below
> >
> >
> > double val;
> > for(i = 0; i< SOME_NUMBER; i++)
> > {
> >    val = (100.0 /SOME_NUMBER)* i /100.0;
> >
>
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pbar),
> val);
> >    gtk_widget_show(pbar);
> > }
> >
> > No error, 'val' value is greater than 0.0 less
> than 1.0. but it
> > doesn't work while app. read file. when app read
> file completly, then
> > progress bar filled fully is shown up.
> > I try to use timeouts, and that how can I read
> file.. ?
> >
> > give me a advise, thank you.
> >
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list gnome org
>
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>

_______________________________________________
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]