On Thu, 2007-11-29 at 20:07 +0800, Ben Lau wrote:
> hi all,
> 
>    I am implementing a GObject (a simple video player) that creates a
> GStreamer pipeline for video processing. Soon it receives a new
> GstBuffer of video frame from the pipeline, it will emit a signal. As
> GStreamer processes the pipeline with multiple threads.  The signal
> handler may not be involved inside the main thread. If my GObject
> calls g_signal_emit() within the handler, then client's callback
> function may also not be involved from the main thread.
> 
>   If the callback uses any Gdk/Gtk functions, then it may cause a race
> condition. Ofcoz it could be avoided by using
> gdk_threads_enter/gdk_threads_leave pair. However, I want to hide the
> multi-threading issue from user ,so that they don't need to care
> about.
> 
>  To achieve this purpose, the signal should be emitted within the main
> thread. Could anybody suggest a method to ensure that a signal is
> emitted within the main thread?
> 
>  I am thinking about to create a GSource to attach to the main
> context. Soon a new frame is ready, it will dispatch the event to my
> video player in main thread. But I wonder would it have any other
> simpler method to achieve the goal?

The callback connected to the GSignal object will execute in the thread
which emits on that object, as you have found, as a GSignal object
comprises a relatively typesafe list of callbacks/closures.

If you want a thread to pass a callback to the main program thread for
execution in the main program thread, the best thing is to use
g_idle_add(), which is thread safe.  Make sure the callback returns
FALSE.

Chris


_______________________________________________
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