还是pygtk中线程的问题

还是pygtk中线程的问题

程序很简单
创建一个线程,这个线程就是循环打印'GGG'
然后创建一个GTK窗口
问题是在GTK运行起来之后刚才创建的线程就不运行了
同样的程序用C语言写的就可以跑
是不是Python的线程有问题呢?

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk, threading, time

class Get(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self, name = "thread1")

   def run(self):
      while True:
         time.sleep(1)
         print 'GGG'

thread = Get()
thread.start()

win = gtk.Window()
win.connect('destroy', gtk.main_quit)
win.show()

time.sleep(3)     #after this sentence, Window show out but thread will hung up
gtk.main()

google "pygtk using thread"
发现这个
http://www.pardon-sleeuwaegen.be/antoon/python/page0.html
不知对你有没有帮助?
bow
一有结果就来向大家汇报


QUOTE:
原帖由 bleem1998 于 2006-2-12 22:39 发表
bow
一有结果就来向大家汇报

又找到这个
http://www.async.com.br/faq/pygt ... ;file=faq20.006.htp
win = gtk.Window()
运行后因为要处理它的时间,所以他去loop去了。而你的线程是在gtk以外创建的,所以需要等到loop结束后,才能到你的线程继续执行。
你应该把线程放到gtk循环以内。
还是不明白这是为什么
就算gtk的线程自己loop等待事件去了
他也不应该让另一个线程停止
这是不是有点奇怪??

就好比我们在c语言里创建了两个线程
一个线程去做死循环了
但是另一个线程还是会顺利的运行
为什么pygtk不可以了呢?


BTW
如果想让1楼的程序运行起来只要加几行就行了
pygtk的FAQ里有

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python
import pygtk, gobject
import gtk, threading, time

class Get(threading.Thread):
   def __init__(self):
      threading.Thread.__init__(self, name = "thread1")

   def run(self):
      while True:
         time.sleep(1)
         print 123

gtk.gdk.threads_init()         #add this
thread = Get()
thread.start()

win = gtk.Window()
win.connect('destroy', gtk.main_quit)
win.show()

gtk.gdk.threads_enter()      #add this
gtk.main()
gtk.gdk.threads_leave()     #add this

但是还是不明白为什么不加这几行不行呢
是不是我还没有跳出C语言的思维方式

gtk.gdk.threads_init()         #add this
thread = Get()
thread.start()
将gtk里面的线程初始化
win = gtk.Window()
win.connect('destroy', gtk.main_quit)
win.show()
这里可以理解gtk是一个进程,主python启动后的进程,你先没在gtk里面继承thread,所以你的gtk和thread分成两个进程了.
gtk.gdk.threads_enter()      #add this
gtk.main()
gtk.gdk.threads_leave()     #add this
这里应该明白了.