On Tue, 2006-12-05 at 22:27 +0000, Christopher Bland wrote:
> >> Based on suggestions from this mailing list I've implemented a pipe to
> >> pass data from my other processes to the main GTK thread. I noticed
> >> that when writing to the pipe there was a long delay before it was
> >> handled. I'm assuming this is because it was a pending event.
> >> 
> >> Can someone please let me know if my code to "fix" this (for lack of a
> >> better word) is correct? The code solves my issue and the pipe is read
> >> immediately, I'm not sure if it is the proper way to do it.
> >> 
> >> [code]
> >> ... main processing ...
> >> 
> >> written = write(status_pipe[1], &var, strlen(var));
> >> gtk_main_iteration();
> >> 
> >> ... continue processing ...
> >> [/code]
> >> 
> >> Is there a better way to do this? Thanks for any input.
> >
> >Um, yes I'd say.
> >
> >Maybe its just my personal opinion but I always prefer letting the main
> >loop do its thing and not hack around it by adding:
> >    "while (events_pending) iteration_do();" 
> >sprinkles here and there, I think its important to write your code in
> >short callbacks and return to the main loop as much as possible.
> 
> I felt the same way, which is the main reason I posted to the list. I'm 
> fairly new to GTK 
> especially when it comes to complex issues like this.
> 
> >Pipes are pipes, in glib or otherwise you need an understanding of how
> >they work in order to give a precise forecast of what your program will
> >do. 
> >
> >Pipes block, for instance if you open a pipe for writing it will block
> >until a reader has opened the other end, writing to the pipe will block
> >until the reader reads the written bytes.
> 
> I'm pretty sure this is exactly what I've been seeing. Within my app I have a 
> 'clicked' event 
> attached to a button which basically starts all of my processing. Within this 
> callback I call 
> my main C++ routine which creates my objects and starts doing work. My app is 
> multi-
> threaded but I had such a headache trying with the threads_enter/leave and 
> someone 
> suggested using pipes and use g_io_add_watch to "watch" a pipe.
> 

It would be alot easier for you to pass data to the main thread
from a child thread using g_idle_add(), just call g_idle_add() from
a thread and the callback will be executed in the main thread -
g_idle_add() is thread safe (you dont need the gdk lock to call
g_idle_add()).

If you then need to pass data you can use GAsyncQueue for that
I think (I never used it) - you can equally store the data you
want to pass on any data struct/list if you protect it properly
with a mutex.

Cheers,
                 -Tristan


_______________________________________________
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