fire
फायरिंग हैंडलर स्वयं सुरक्षित है; यह IORef
पढ़ता है जिसे परमाणु रूप से अपडेट किया जा रहा है और वर्तमान थ्रेड में जोड़े गए हैंडलरों में से प्रत्येक को चलाता है। चाहे वह सुरक्षित है या नहीं, इस पर निर्भर करेगा कि addHandler
में कौन से हैंडलर जोड़े गए हैं।
addHandler
interpretAsHandler
, fromAddHandler
, या fromChanges
में सुरक्षित होना चाहिए। प्रतिक्रियाशील-केले में मुझे कुछ भी पता नहीं है, इसमें कोई थ्रेड एफ़िनिटी है, और यहां तक कि अगर ऐसा होता है, तो ये newAddHandler
के लिए बनाया गया था, इसलिए यह सुरक्षित होना चाहिए।
reactimate
द्वारा निष्पादित IO()
क्रियाओं के बारे में आपको सावधान रहने की आवश्यकता है। यदि आपको IO
क्रियाओं को एक विशिष्ट थ्रेड (ओपनजीएल आउटपुट, आदि के लिए) में चलाने की आवश्यकता है, तो आपको केवल IO()
क्रियाएं उत्पन्न करने की आवश्यकता है जो उनके डेटा को उस थ्रेड पर भेज देंगे। इस complete OpenGL example for reactive-bananaIO()
ओपनजीएल आउटपुट के लिए क्रियाएं, जिनमें थ्रेड एफ़िनिटी है, ओपनजीएल थ्रेड में चलाए जाते हैं। इसके बजाय reactimate
Event (IO())
ing उन्हें सीधे वे जुड़ जाते हैं क्रियान्वित एक IORef
whenIdleRef <- newIORef (return())
let
addWhenIdle :: IO() -> IO()
addWhenIdle y = atomicModifyIORef' whenIdleRef (\x -> (x >> y,()))
runWhenIdle :: IO()
runWhenIdle = atomicModifyIORef' whenIdleRef (\x -> (return(), x)) >>= id
let networkDescription :: forall t. Frameworks t => Moment t()
networkDescription = do
reactimate $ fmap addWhenIdle (whenIdle outputs)
^ ^
| Event (IO())
Stuff the event into an IORef
IORef
धारण करने के लिए जो चलाने के लिए IO()
कार्यों पढ़ा जाता है और सभी कार्यों में से प्रत्येक एक संदर्भ में चलाए जा रहे हैं कि मैं जानता हूँ कि ओपन में है धागा।
idleCallback $= Just (do -- will be executed in the OpenGL thread when it's idle
getCurrentTime >>= raiseTime
runWhenIdle -- run those `IO()` actions in this thread
postRedisplay Nothing)
इससे यह बहुत स्पष्ट हो जाता है। –