0

我对 gtk 中的线程有一个基本的怀疑。我想在 gtk 中并行运行两个函数。如果我使用 gobject_timeoutadd 是否可以。如果是,我应该使用 gtk.thread_enter 和 gtk.thread_leave 吗?

我对程序的想法是这样的

import gtk,gobject

class Gtk_main:

    def __init__(self):
        self.a=2
        self.b=3
        gobject.timeout_add(1000,self.test_1)
        gobject.timeout_add(1000,self.test_2)        


    def test_1(self):

        return True

    def test_2(self):

        return True



Gtk_main()
gobject.threads_init()
gtk.gdk.threads_init()
gtk.main()

此代码只是一个示例。当我真正使用 gtk.thread_enter 和 gtk.thread_leave 时,程序挂起。所以我想澄清我对 gtk 线程的理解。

提前致谢, thothadri

4

3 回答 3

1

您的示例挂起,因为在进入循环之前和退出循环之后gtk.main()调用,所以如果您调用您的代码应该类似于以下代码。gdk_threads_leave()gdk_threads_enter()gtk.gdk.threads_init()

...
gobject.threads_init()
gtk.gdk.threads_init()
Gtk_main()
gtk.gdk.threads_enter()
gtk.main()
gtk.gdk.threads_leave()

PS。我不确定Gtk_main()必须在线程初始化之后进行,但我认为它不会受到伤害。

正如 ptomato 所说,timeout_add()它不是线程安全的,但只有当您需要从不同的线程调用 gtk 函数时,这才是一个问题。一个简单的方法是:

import functools


def thread_safe(func):
    @functools.wraps
    def wrapper(*args, **kwds):
        gtk.gdk.threads_enter()
        try:
            return func(*args, **kwds)
        finally:
            gtk.gdk.threads_leave()
    return wrapper

threads_timeout_add = thread_safe(gobject.timeout_add)
于 2012-11-14T13:53:28.340 回答
1

如果只使用超时,则不需要使用 GDK 线程。

如果您同时使用超时和线程,那么您不需要在超时回调中调用threads_enter()threads_leave()

于 2012-11-14T11:02:46.720 回答
0

我总是在我的程序中使用 Python 而不是GTK 线程,效果很好。

但是,它仍然是必要的gobject.threads_init(),甚至可能gtk.gdk.threads_init() 取决于您的 GTK 版本。

您还需要import threading,您可以在官方 python 文档中找到极好的文档。

于 2012-11-09T10:50:53.250 回答