代码之家  ›  专栏  ›  技术社区  ›  Thanatos

gtk idle\u add不运行?

  •  4
  • Thanatos  · 技术社区  · 14 年前

    我有一个两线程的应用程序:GUI和一些后台工作。我试图向主线程发送请求以进行GUI更新(移动进度条),但似乎不起作用。我把它归结为一个非常简单的例子:

    import pygtk
    pygtk.require('2.0')
    import glib
    import gtk
    
    import threading
    import sys
    import time
    
    def idle():
        sys.stderr.write('Hello from another world.\n')
        sys.stderr.flush()
        gtk.main_quit()
    
    def another_thread():
        time.sleep(1)
        glib.idle_add(idle)
    
    thread = threading.Thread(target=another_thread)
    thread.start()
    gtk.main()
    

    gtk.main_quit 没有人打电话。

    另外,增加更多的输出到 stderr 行为怪异。如果我将线程的函数更改为:

    sys.stderr.write('----\n')
    sys.stderr.write('----\n')
    sys.stderr.flush()
    sys.stderr.write('After.\n')
    sys.stderr.flush()
    

    gtk.main 但我不知道为什么会这样。

    3 回复  |  直到 14 年前
        1
  •  5
  •   vanza    14 年前

    glib.threads_init()
    

    在调用glib函数之前。

        2
  •  3
  •   ptomato    14 年前

    glib.timeout_add_seconds(1, idle) 然后回来 False idle() 而不是开始一个线程然后睡一秒钟?从另一个线程启动空闲函数是非常多余的,因为空闲函数已经在另一个线程中运行了。

    编辑:

    通过“从另一个线程启动空闲函数是多余的”,我的意思是您不必为了搞乱GUI和更新进度条而启动空闲函数。你不能在其他线程中搞乱GUI,这是一个神话。

    1. 呼叫 glib.threads_init() gobject.threads_init()
    2. 呼叫 gtk.gdk.threads_init() . 我很肯定你的回答是对的,这只需要在你之前打电话 gtk.main() gtk_init() ,但如果我没弄错的话,那是在PyGTK的导入时间调用的。
    3. 把你的电话转到 gtk.main公司() 之间 gtk.gdk.threads_enter() gtk.gdk.threads_leave() .
      • 主线程以外的线程
      • 空闲函数
      • 超时
      • 基本上除了信号处理程序以外的任何回调

      之间 gtk.gdk.u离开()

    请注意,不要用 enter / leave with gtk.gdk.lock: 在这个范围内打电话 with -阻止。

    以下是一些资源,也解释了这个问题:

        3
  •  0
  •   Thanatos    14 年前

    以下是我的工作原理:

    打电话给 gtk.gdk.threads_init() 在执行其他操作之前:在启动线程之前,在进入 gtk.main() . 我认为在现实中,这只需要在进入前调用 gtk.main公司() ,但是当一切都是单线程和简单的时候调用它就足够容易了。

    在空闲回调中( idle ,在示例中),调用 gtk.gdk.threads_enter() gtk.gdk.threads_leave() ,在函数结束之前。

    gtk.gdk.threads\u初始化() 似乎还告诉PyGTK,当GIL进入睡眠状态时不要握住它-我想我错过了aux的一些输出。示例中的线程只是因为休眠的主线程 gtk.main公司() gtk.gdk.threads\u初始化() ,据我所知,向PyGTK和GTK+注入了良好的魔力。因为这个, gtk.gdk.threads\u初始化()