2011-05-23 5 views
7

मैं पीईजीटीके के साथ थ्रेड-बग के साथ खेलना चाहता हूं। मेरे पास यह कोड अब तक है:गैर-जीयूआई थ्रेड्स को अवरुद्ध करने वाले पीईजीटीके

#!/usr/bin/python 

import pygtk 
pygtk.require('2.0') 
import gtk 
import threading 
from time import sleep 

class SomeNonGUIThread(threading.Thread): 
    def __init__(self, tid): 
     super(SomeNonGUIThread, self).__init__() 
     self.tid = tid 

    def run(self): 
     while True: 
      print "Client #%d" % self.tid 
      sleep(0.5) 

class App(threading.Thread): 
    def __init__(self): 
     super(App, self).__init__() 

     self.window = gtk.Window() 
     self.window.set_size_request(300, 300) 
     self.window.set_position(gtk.WIN_POS_CENTER) 
     self.window.connect('destroy', gtk.main_quit) 

     self.window.show_all() 

    def run(self): 
     print "Main start" 
     gtk.main() 
     print "Main end" 


if __name__ == "__main__": 
    app = App() 

    threads = [] 
    for i in range(5): 
     t = SomeNonGUIThread(i) 
     threads.append(t) 

    # Ready, set, go! 
    for t in threads: 
     t.start() 

    # Threads work so well so far 
    sleep(3) 

    # And now, they freeze :-(
    app.start() 

ऐसा करता है कि nonGUIThreads 3 सेकंड के लिए चल रहे हैं। इसके बाद, खिड़की दिखाई जाती है और अन्य धागे रुक गए हैं! खिड़की बंद करने के बाद, धागे फिर से चल रहे हैं।

यह कैसे संभव है, gtk.main() अन्य धागे को अवरुद्ध करने में सक्षम है? धागे किसी भी ताला पर निर्भर नहीं हैं, इसलिए उन्हें खिड़की के दौरान काम करना चाहिए।

उत्तर

5

आपको जीटीके से संबंधित कुछ भी करने से पहले gobject.threads_init() पर कॉल करना होगा।

More info in PyGtk's FAQ

+0

आपके उत्तर के लिए धन्यवाद! मुझे वह पृष्ठ मिला लेकिन मैंने सोचा कि यह केवल स्थिति के लिए है जब थ्रेड जीटीके के साथ संवाद करना चाहते हैं। मैं गलत था। – izidor