読者です 読者をやめる 読者になる 読者になる

pygtk内でthreadingは使えない

pythonのthreadingライブラリはforkとかしてるわけではないらしく,pygtk.mainに制御が移っている間はスレッドが実行されない.らしい.(http://blog.yakumo.la/blog/2009/03/25/pygtk%E3%81%A7%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%87%A6%E7%90%86%E3%80%82/)
実際に実行してみるとたしかにスレッドが実行されていなくて,イベントが起きて制御が戻ってきてる間だけスレッドが動く.
なので,http://d.hatena.ne.jp/kakurasan/20090225/p1 タイマーとかで我慢するのが一番良さそう.

pygtk内でthreadingを動かすサンプルコード

#!/usr/bin/env python

import pygtk
import gtk
import time
import threading

class threadtest(threading.Thread):
	def __init__(self):
		threading.Thread.__init__(self)

	def run(self):
		while True :
			print '--thread--'
			time.sleep(0.1)

class pygtktest:
	def __init__(self):
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.window.show()
		self.window.connect("event", self.callback)
		self.t = threadtest(self)
		self.t.setDaemon(True)
		self.t.start()

	def main(self):
		gtk.main()

	def callback(self, widget, event) :
		print "--event--"

print __name__
if __name__ == "__main__":
	test = pygtktest()
	test.main()