2009-03-13 14 views
13

मेरे पास एक ऐसा फ़ंक्शन है जो कभी-कभी लटकता है। आम तौर पर मैं अलार्म सेट करता हूं, लेकिन मैं विंडोज़ में हूं और यह अनुपलब्ध है। क्या इसके चारों ओर एक आसान तरीका है, या मुझे सिर्फ एक धागा बनाना चाहिए जो time.sleep() को कॉल करता है?विंडोज़ में सिग्नल.अल्म प्रतिस्थापन [पायथन]


एक थ्रेड के साथ जा रहा है। केवल चाल os._exit के बजाय sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
+2

के बजाय os._exit उपयोग कर रहा था क्या आप कृपया * अपने * सवाल से जवाब को निकालें और एक ... वास्तविक * जवाब * के रूप में पोस्ट कर सकते हैं? – ThiefMaster

+1

आप [थ्रेडिंग टिमर() 'के बजाय उपयोग कर सकते हैं [http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ थिफमास्टर किया गया! – LondonRob

उत्तर

2

आप सका उपयोग कर रहा था - के रूप में आप का उल्लेख किया - बस एक नया धागा है कि कुछ सेकंड की संख्या के लिए सोता भी शुरू किया।

या आप विंडोज़ के मल्टीमीडिया टाइमर (पायथन में, जो windll.winmm में होंगे) का उपयोग कर सकते हैं। मेरा मानना ​​है कि timeSetEvent वह है जिसे आप ढूंढ रहे हैं। संयोग से, मुझे कोड का एक टुकड़ा मिला जो here का उपयोग करता है।

3

सबसे मजबूत समाधान एक उपप्रोसेसर का उपयोग करना है, फिर उस सबप्रोसेस को मार दें। Python2.6 जोड़ता है .kill() subprocess.Popen() में।

मुझे नहीं लगता कि आपका थ्रेडिंग दृष्टिकोण आपकी अपेक्षा के अनुसार काम करता है। थ्रेड ऑब्जेक्ट में आपका संदर्भ हटाने से धागे को नहीं मारना होगा। इसके बजाए, आपको एक विशेषता सेट करने की आवश्यकता होगी जिसे धागा जागने के बाद चेक करता है।

एक धागा के साथ जा रहा समाप्त हुई:

+0

क्या आप स्पष्ट कर सकते हैं कि एक निश्चित समय के बाद एक फांसी समारोह से निपटने के लिए '.kill()' का उपयोग कैसे करें? –

+0

रमफोरिनकस: मुझे लगता है कि थ्रेड संदर्भ को हटाने या हटाने के बारे में आपका मुद्दा इस मामले में कुछ हद तक मूक है। आखिरी बात 'थ्रेडिंग' की 'रन()' विधि। थ्रेड 'सबक्लस कॉल' os._exit() 'है, और यहां तक ​​कि अगर ऐसा नहीं होता है, तो विधि समाप्त हो जाएगी और प्रभावी ढंग से "मारे गए" बन जाएगी। बदतर में 'डेल अलार्म' अनावश्यक हैं। – martineau

3

यहाँ कैसे मूल पोस्टर अपने ही समस्या हल है। केवल चाल sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
संबंधित मुद्दे