On 6/4/07, Gabriele Greco <[EMAIL PROTECTED]> wrote:
> The question I have and which I didn't find answers both googling, both
> looking at the sources is if g_idle_add can be called without any extra
> mutex/lock from another thread.

Yes, this works fine. You do need to init the threads system, but of
course you will have to do that before you can call g_thread_create()
to make your worker.

> Ideally my code should be something like:

I think the best way to do this is model-view style.  So your worker
thread does this:

 my_thread()
 {
   for(;;){
     // worker thread main loop
     Thing *stuff;

     stuff = g_new( Thing, 1 );
     calculate_thing( stuff );
     g_idle_add( handle_stuff, stuff );
   }
 }

Then the function handle_stuff will be run by your program's main loop
thread when it's next idle:

 gint
 handle_stuff( Thing *stuff )
 {
   update_model( stuff );
   g_free( stuff );
   return( FALSE );
 }

Update_model() uses the calculated data to update the data structures
underlying your program, but does not try to update the display.

Instead it adds another idle handler (cancelling the previous one, if
any) which will update all the screen widgets from the underlying
data.

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

Reply via email to