Am Montag, den 17.12.2007, 16:01 -0500 schrieb Andres Gonzalez:
> Everybody is saying that all of my Gtk processing should be done in
> the main thread, and indeed, whenever I use a Gtk/Gdk routine in my
> camera thread I get Xlib async errors. But then how do I trigger a
> render from my camera thread whenever my camera buffer gets a new
> video frame without calling a Gtk/Gdk API routine?
The recommended pattern for passing data from a worker thread to the
main thread, is installing an idle-function with g_idle_add(). The
g_idle_add() function is designed to be thread safe
One variant to achieve that would be:
static gboolean
update_canvas_cb (gpointer data)
{
gtk_widget_queue_draw (canvas_widget);
return FALSE; /* remove the callback */
}
...
g_idle_add (update_canvas_cb, NULL);
...
Notice that you cannot directly connect gtk_widget_queue_draw(), since
that function has no (defined) return value.
> I currently have a common memory buffer that both threads have access
> to. But the Gdk_pixbuf routines seem to be double buffering the data
> so I have to use a Gdk_draw routine to have my common memory rendered.
No need for a shared buffer. Just pass ownership of the picture buffer
to the main thread, by passing it as user_data argument to g_idle_add.
After doing that, the worker thread can discard the pointer:
g_idle_add (update_canvas_cb, picture);
picture = NULL; /* ownership passed to main-thread */
Ciao,
Mathias
--
Mathias Hasselmann <mathias hasselmann gmx de>
Openismus GmbH: http://www.openismus.com/
Personal Site: http://taschenorakel.de/
Attachment:
signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil