On Thu, 15 Dec 2011 14:38:37 +0100, Antoon Pardon wrote:
Does anyone know of possible problems when gtk.main is started in a
thread?
I have been experimenting a bit with writing a canvas for programs
that just
need to draw things, without having to bother with mouse-clicks,
key-presses
etc. The idea was to have a thread to would do the minimum necessary,
mostly
expose events and let the rest of the program draw things on the
canvas.
Now I have been working on this on two very similar debian boxes. On
one it
works without a problem on the other it keeps getting blocked. It
seems to
boil down to the following bit of code:
def startgtk(func, gtkthread = False):
if gtkthread:
thrd = Thread(target = gtk.main, name = "GTK thread")
thrd.deamon = True
thrd.start()
func()
else:
thrd = Thread(target = func, name = "Canvas thread")
thrd.deamon = True
thrd.start()
gtk.main()
Calling this with gtkthread = False, doesn't pose a problem
but calling it with gtkthread = True makes it block on
one computer.
gtk.main() just adds a new event source to the default GMainContext
[1].
Looking at GLib docs [2] we learn that: "... A GMainContext can only
be running in a single thread, ...". Looks to me that what you are
trying to do is not possible?
mvg,
Dieter
[1] snippet from generated gtk.c, it's the g_source_attach
call I'm talking about:
static PyObject *
_wrap_gtk_main(PyObject *self)
{
GSource *main_watch;
// Call enable_threads again to ensure that the thread state is
recorded
if (pyg_threads_enabled)
pyg_enable_threads();
main_watch = pygtk_main_watch_new();
pyg_begin_allow_threads;
g_source_attach(main_watch, NULL);
g_source_unref(main_watch);
gtk_main();
g_source_destroy(main_watch);
pyg_end_allow_threads;
if (PyErr_Occurred())
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
#line 125761 "gtk/gtk.c"
[2] http://developer.gnome.org/glib/2.28/glib-The-Main-Event-Loop.html
_______________________________________________
pygtk mailing list [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/