0

gtkのスレッドについて基本的な疑問があります。gtkで2つの関数を並行して実行したいと思います。同じに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()andを呼び出す必要はありませんthreads_leave()

于 2012-11-14T11:02:46.720 に答える