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/

Reply via email to