2009-11-25 76 views
6

我正在编写一个框架使用pygtk的程序。主程序做以下的事情:Python,线程和gobject

  1. 创建一个监视线程来监视一些资源
  2. 创建一个客户端接收从插座
  3. 呼叫gobject.Mainloop()

数据,但是我的计划后,似乎进入Mainloop,看门狗线程也不会运行。

我的解决方法是使用gobject.timeout_add来运行显示器。

但为什么创建另一个线程不起作用?

这里是我的代码:

import gobject 
import time 
from threading import Thread 

class MonitorThread(Thread): 

    def __init__(self): 
     Thread.__init__(self) 

    def run(self): 
     print "Watchdog running..." 
     time.sleep(10) 

def main(): 

    mainloop = gobject.MainLoop(is_running=True) 

    def quit(): 
     mainloop.quit() 

    def sigterm_cb(): 
     gobject.idle_add(quit) 


    t = MonitorThread() 
    t.start() 

    print "Enter mainloop..." 

    while mainloop.is_running(): 
     try: 
      mainloop.run() 
     except KeyboardInterrupt: 
      quit() 

if __name__ == '__main__': 

    main() 

程序输出唯一的 “看门狗运行...进入主循环..”,然后什么。 似乎线程进入主循环后永远不会运行。

+1

你还期望什么?有了上面的代码,我期望这两件事每次都打印一次。 – u0b34a0f6ae 2009-11-25 15:49:19

回答

9

你能发表一些代码吗?可能是因为Global Interpreter Lock有问题。

Your problem solved by someone else :)。我可以在这里复制粘贴文章,但总之gtk的c线程与Python线程发生冲突。您需要通过调用gobject.threads_init()来禁用c线程,并且所有应该是都可以。

+0

谢谢,我添加了一些代码片段,这个代码有什么问题吗? – 2009-11-25 13:13:44

+0

明白了。感谢您的信息。 – 2009-11-25 15:05:32

+2

我很高兴你在答案中增加了一个简短提示,因为链接现在已经死了。 – vidstige 2016-09-01 07:31:38

2

您无法在gtk中初始化基于线程的代码路径。

你必须记住两件事情的时候 使用线程与PyGTK的:

  1. GTK主题必须gtk.gdk.threads_init进行初始化:

http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html,版权完全保留作者。不得删除此版权声明。

你可以认为glib/gobject代替pygtk,它是一样的东西。

+0

谢谢,我在GTK中退出了新的版本。信息有帮助。 – 2009-11-26 01:50:30