2013-03-27 3 views
16

मैं हास्केल के लिए नया ब्रांड हूं और मैं यह पता लगाने की कोशिश कर रहा हूं कि अब से एक्स सेकंड को निकालने के लिए कॉलबैक शेड्यूल कैसे करें (और जल्द नहीं)।हास्केल में एक टाइमआउट शेड्यूल करना

Hoogle और गूगल खोज में, मुझे पता चला है:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/GHC-Event.html

के साथ-साथ:

http://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-Event.html

इन दोनों एक "registerTimeout" समारोह है कि ऐसा करने के लिए लगता है की सुविधा मैं क्या चाहता हूँ। हालांकि, सिस्टम.इवेंट अब हास्केल और जीएचसी के नवीनतम निर्माण में नहीं दिखता है। इवेंट को आंतरिक होने के रूप में चिह्नित किया जाता है।

क्या कोई उपयोगकर्ता-स्पेस विकल्प मैं उपयोग कर सकता हूं? मैं जीएलयूटी के लिए इच्छित समय कार्यों का उपयोग नहीं करना चाहूंगा (जब तक कि यह मेरा लक्ष्य प्राप्त करने का निर्धारित तरीका न हो), और सिस्टम। टाइमआउट जो कुछ भी मैं चाहता हूं वह प्रकट नहीं होता है; इसका उद्देश्य अधिकतम से अधिक समय के लिए कुछ समय लेना है।

आपके इनपुट के लिए धन्यवाद!

उत्तर

19

मैं विलंब के बाद अपने स्वयं के धागे पर कॉलबैक निष्पादित कर दूंगा। यह एक जीएचसी-आईएसएम है।

import Control.Concurrent (forkIO, threadDelay) 

-- | Run the callback after the given number of milliseconds. 
runAfterDelay :: Int -> IO() -> IO() 
runAfterDelay t f = forkIO (threadDelay t >> f) 

जीएचसी में थ्रेड असाधारण रूप से हल्के वजन वाले हैं, इसलिए यह सिस्टम संसाधनों को जोड़ नहीं लेगा।

+1

यह समझ में आता है! बहुत बहुत धन्यवाद। मैं धागे से परहेज कर रहा था क्योंकि मुझे लगता है कि उन्हें उछालने/शामिल होने के लिए महंगा माना जाता है। मुझे यह देखने में उत्सुकता है कि इनमें से कितने मेमोरी खपत एक बड़ी समस्या बनने के बिना एक प्रक्रिया में बैठे हैं। बेंचमार्किंग शुरू करने का समय। – zslayton

+3

@ ज़ैक: ओवरहेड के बारे में चिंता न करें, यह बहुत छोटा है। देखें: http://stackoverflow.com/questions/5847642/haskell-lightweight-threads-overhead-and-use-on-multicores –

+0

वाह, तो यह है। मैं वास्तव में इस हास्केल व्यवसाय को पसंद करना शुरू कर रहा हूं। – zslayton

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