Re: Gtk and threading



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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]