2012-03-20 10 views
7

पर समकक्ष मेरे पास मेरा मुख्य अनुप्रयोग धागा है जो 2 धागे को फैलाता है और मैं अपने मुख्य धागे में सिगिनट को अच्छी तरह से छोड़ने के लिए पकड़ता हूं। लिनक्स पर, मैं signal.pause() का उपयोग कर रहा हूं और यह पूरी तरह से काम करता है।पायथन: सिग्नल.pause() विंडोज

विंडोज पर सिग्नल.pause() को लागू करने का सबसे अच्छा तरीका क्या है?

मेरे बदसूरत समाधान है:

my_queue.get(True, averylongtime) 

और मेरे संकेत हैंडलर में my_queue में कुछ डाल दिया। ध्यान दें कि यदि मैं टाइमआउट निर्दिष्ट नहीं करता हूं, तो SIGINT पकड़ा नहीं जाता है। लेकिन मुझे आश्चर्य है कि क्या एक बेहतर समाधान है।

धन्यवाद

+0

आप सिगिनट कैसे बना रहे हैं? यदि यह कीबोर्ड से सिर्फ + C है तो आप कीबोर्ड इंटरप्ट को जाल कर सकते हैं। अन्यथा यह Win32 ईवेंट को बढ़ाने का मामला हो सकता है। – cdarke

उत्तर

0

मैं इस का उपयोग करें:

#another: 
while not self.quit: 
    # your code 

# main 
try: 
    # your code 
except KeyboardInterrupt: 
    another.quit = True 
    time.sleep(5) # or wait for threading.enumerate() or similar 

अगर मैं चाहता हूँ यह और अधिक मजबूत, कहते हैं, कीड़े की उपस्थिति में भी बाहर निकलने:

except KeyboardInterrupt: 
    another.quit = True 
    signal.alarm(5) 
    time.sleep(6) 

इस के लिए एक पक्ष प्रभाव है कि हर ब्लॉक जहां आप except: या except Exception, e: (जो कुछ भी आपको कुछ भी नहीं करना चाहिए) आपको except KeyboardInterrupt: raise को प्रीपेड करना होगा ताकि अपवाद "खाया न जाए "।

+0

आपके उत्तर का हिस्सा विंडोज पर काम नहीं करेगा जो सवाल है। सिग्नल.एलार्म विंडोज –

+0

पर अच्छा पकड़ नहीं है @ फिलिपपेऑम्ब्रेडैन –

+0

और एफडब्ल्यूआईडब्ल्यू @ वर्मा ... मुझे सिग्नल.लर्म की तरह काम करने वाली कुछ चीज़ों में दिलचस्पी होगी लेकिन विंडोज़ पर –

0

मैं विंडोज़ पर ctrl-c को पकड़ने के लिए इसका उपयोग करता हूं। यदि मैं एक पाइप या फ़ाइल या आप क्या लिख ​​रहा हूं .. मैं कृपा से बाहर निकलना चाहता हूं। नीचे एक खिलौना उदाहरण

import signal 
import sys 

def signal_handler(signal, frame):  
    print('Process Interrupted!\n\a') 
    sys.exit(0) 

signal.signal(signal.SIGINT,signal_handler) 

#Rest of your code