免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3154 | 回复: 6
打印 上一主题 下一主题

还是pygtk中线程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-08 09:59 |只看该作者 |倒序浏览
程序很简单
创建一个线程,这个线程就是循环打印'GGG'
然后创建一个GTK窗口
问题是在GTK运行起来之后刚才创建的线程就不运行了
同样的程序用C语言写的就可以跑
是不是Python的线程有问题呢?


  1. #!/usr/bin/env python
  2. import pygtk
  3. pygtk.require('2.0')
  4. import gtk, threading, time

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

  8.    def run(self):
  9.       while True:
  10.          time.sleep(1)
  11.          print 'GGG'

  12. thread = Get()
  13. thread.start()

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

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

复制代码

论坛徽章:
0
2 [报告]
发表于 2006-02-12 22:26 |只看该作者
google "pygtk using thread"
发现这个
http://www.pardon-sleeuwaegen.be/antoon/python/page0.html
不知对你有没有帮助?

论坛徽章:
0
3 [报告]
发表于 2006-02-12 22:39 |只看该作者
bow
一有结果就来向大家汇报

论坛徽章:
0
4 [报告]
发表于 2006-02-12 23:10 |只看该作者
原帖由 bleem1998 于 2006-2-12 22:39 发表
bow
一有结果就来向大家汇报

又找到这个
http://www.async.com.br/faq/pygt ... ;file=faq20.006.htp

论坛徽章:
0
5 [报告]
发表于 2006-02-13 08:53 |只看该作者
win = gtk.Window()
运行后因为要处理它的时间,所以他去loop去了。而你的线程是在gtk以外创建的,所以需要等到loop结束后,才能到你的线程继续执行。
你应该把线程放到gtk循环以内。

论坛徽章:
0
6 [报告]
发表于 2006-02-13 18:21 |只看该作者
还是不明白这是为什么
就算gtk的线程自己loop等待事件去了
他也不应该让另一个线程停止
这是不是有点奇怪??

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


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

  1. #!/usr/bin/env python
  2. import pygtk, gobject
  3. import gtk, threading, time

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

  7.    def run(self):
  8.       while True:
  9.          time.sleep(1)
  10.          print 123

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

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

  17. gtk.gdk.threads_enter()      #add this
  18. gtk.main()
  19. gtk.gdk.threads_leave()     #add this
复制代码


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

[ 本帖最后由 bleem1998 于 2006-2-13 18:32 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-02-22 16:56 |只看该作者
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
这里应该明白了.

[ 本帖最后由 xichen 于 2006-2-22 16:57 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP