解決策: withManager
を実行しているスレッド__自体を__起動させ続ける
haddockの例プログラムのコメントに
-- start a watching job (in the background)
と書かれているので「これ自身でforkIO
してくれている」と思ってしまいがちだ(思ってしまった)が、
__それを実行している側のスレッドも生かしておく必要がある__らしい。
自分の場合、メインスレッドでは他のプログラムを動かしていたので、forever $ threadDelay 10000
を抜かしてしまいこれにはまった。
なので、同じように__メインスレッドは別でやることがある場合__以下のようにforkIO
してあげるといい。
watchUpdate ... = forkIO . withManager . \mng -> do
-- `watchDir`等で監視する
forever $ threadDelay 10000
ちなみに、自分が使った例はこちら(github: Cj-bc/brick-shgif)
-- | Watch specified file and send FileUpdated event
-- when it's updated.
watchUpdate :: BChan CustomEvent -> FilePath -> IO ()
watchUpdate ch fn = void . forkIO . withManager $ \mng -> do
watchDir
mng
(takeDirectory fn)
isWatchedFile
sendEvent
forever $ threadDelay 10000
where
isWatchedFile :: FSN.Event -> Bool
isWatchedFile e = case e of
Modified fn _ _ -> True
otherwise -> False
sendEvent :: FSN.Event -> IO ()
sendEvent = \_ -> writeBChan ch FileUpdated
Comments
Let's comment your feelings that are more than good