Bắn chính bộ xử lý fire
là an toàn; nó đọc một số IORef
đang được cập nhật một cách nguyên tử và chạy từng bộ điều khiển được thêm vào trong chuỗi hiện tại. Có hay không đó là an toàn sẽ phụ thuộc vào những gì xử lý đã được thêm vào addHandler
.
Sử dụng addHandler
trong interpretAsHandler
, fromAddHandler
hoặc fromChanges
phải an toàn. Không có gì tôi biết trong phản ứng chuối có bất kỳ mối quan hệ sợi, và ngay cả khi nó đã làm, đây là những gì newAddHandler
đã được thực hiện cho, vì vậy nó nên được an toàn anyway.
Điều bạn cần cẩn thận là các hành động IO()
được thực hiện bởi reactimate
. Nếu bạn cần phản ứng IO
các hành động cần được chạy trong một chuỗi cụ thể (đối với đầu ra OpenGL, v.v.), bạn chỉ cần tạo các hành động IO()
sẽ gửi dữ liệu của họ đến chuỗi đó. Trong complete OpenGL example for reactive-banana hành động IO()
cho đầu ra OpenGL này, có ái lực luồng, được chạy trong chuỗi OpenGL. Thay vì reactimate
ing các Event (IO())
thực hiện trực tiếp chúng được thêm vào một 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
Các IORef
nắm giữ mà IO()
hành động để chạy được đọc và mỗi người trong số tất cả các hành động được chạy trong một bối cảnh mà tôi biết là trong OpenGL chủ đề.
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)
Điều đó làm cho nó rất rõ ràng. –