From: Jeffrey B. <jef...@ea...> - 2009-06-20 16:22:04
|
Arnout Vandecappelle wrote: > [This is actually not about GStreamer anymore, but what the heck.] > > On Friday 19 June 2009 00:48:39 Jeffrey Barish wrote: >> Here's what's baffling me. This works: >> >> loop = gobject.MainLoop() >> context = loop.get_context() >> while True: >> context.iteration(False) >> time.sleep(1.0) >> >> This doesn't: >> >> loop = gobject.MainLoop() >> context = loop.get_context() >> while True: >> context.iteration(True) > > Since you haven't registered any sources for the main loop, it will block > forever. And unless you created another thread or signal handler > somewhere that calls loop.quit(), there is no way to get out of it. > >> The difference is that the second one blocks on the iteration. What is >> it about blocking that is incompatible with running this code in its own >> thread? > > AFAIK mainloops aren't really meant to be controlled from multiple > threads. > Inside the context.iteration(True), the mainloop will block waiting for an > event on any of its registered sources. Once it's blocking, I don't think > adding a source from another thread interrupts the block. You'd probably > need to do a loop.quit() and re-run the mainloop. Thanks again for the suggestion. I did register a source for the main loop, I just didn't show that code. Neither of the two versions would work without a source. The source is playbin2, which is instantiated in the main thread (as both loops need to communicate with it). I serialize communication with playbin2 from the two threads using a thread-safe queue (except that for some reason it does not work to set a property on playbin2 (e.g., 'uri') through the queue, so I set that one directly). Now that the code is working, I can tell you that the gobject loop is getting messages from playbin2 even though they are in different threads. I solved the problem by adding a gobject.threads_init call. I believe that this call is required only by the Python bindings for gobject. The only remaining problem of which I am aware (aside from the strangeness with setting the uri property) is this error message: Received message [<GstGError at 0x9ebaf90>, 'gstbin.c(2240): gst_bin_do_latency_func (): /GstPlayBin2:player:\nFailed to configure latency of 0:00:00.000000000'] I get this error message at every segue. Anyone know what it means? -- Jeffrey Barish |