2009-11-25 11 views
6

मैं pygtk का उपयोग करके एक ढांचे द्वारा एक प्रोग्राम लिख रहा हूं। मुख्य निम्नलिखित बातें कर कार्यक्रम:पायथन, थ्रेड और गोबजेक्ट

  1. कुछ संसाधन
  2. नजर रखने के लिए सॉकेट
  3. कॉल gobject.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() 

कार्यक्रम उत्पादन केवल "निगरानी चल ... mainloop दर्ज ..", तो कुछ भी नहीं है। लगता है कि थ्रेड कभी मुख्यलोप दर्ज करने के बाद नहीं चलता है।

+1

आप और क्या उम्मीद करते हैं? उपर्युक्त कोड के साथ, मैं उन दो चीजों को एक बार मुद्रित करने की अपेक्षा करता हूं। – u0b34a0f6ae

उत्तर

9

क्या आप कुछ कोड पोस्ट कर सकते हैं? यह हो सकता है कि आपको Global Interpreter Lock के साथ समस्याएं हो।

Your problem solved by someone else :)। मैं यहां आलेख को कॉपी-पेस्ट कर सकता हूं, लेकिन छोटे gtk के सी-थ्रेड्स में पाइथन थ्रेड के साथ संघर्ष होता है। आपको gobject.threads_init() को कॉल करके सी-थ्रेड को अक्षम करने की आवश्यकता है और सभी ठीक होना चाहिए।

+0

धन्यवाद, मैं कुछ कोड स्निपेट जोड़ता हूं, इस कोड के साथ कोई ग़लत? –

+0

समझ गया। जानकारी के लिए धन्यवाद। –

+2

मुझे खुशी है कि आपने जवाब में एक छोटा संकेत जोड़ा क्योंकि लिंक अब मर चुका है। – vidstige

2

आप gtk में थ्रेडिंग-आधारित कोड-पथ प्रारंभ करने में विफल रहे हैं।

आप दो बातें याद रखना चाहिए जब PyGTK साथ धागे का उपयोग कर:

  1. जीटीके धागे gtk.gdk.threads_init साथ initialised किया जाना चाहिए:

http://unpythonic.blogspot.com/2007/08/using-threads-in-pygtk.html से, कॉपीराइट पूरी तरह से बनाए रखा लेखक द्वारा यह कॉपीराइट नोटिस हटाया नहीं जाना चाहिए।

आप pygtk के बजाय glib/gobject सोच सकते हैं, यह वही बात है।

+0

धन्यवाद, मैं जीटीके में नया छोड़ दिया गया हूं। जानकारी मदद करता है। –

संबंधित मुद्दे