Я пытаюсь использовать hinotify и STM сделать простую концепцию:Ожидание, пока файл перестает быть модифицирована
- блокировать поток выполнения, пока смотрел файл останавливается не модифицируется
- Продолжить раз модификации останавливаются или их интервал больше некоторого порогового значения времени (debounces)
В настоящее время я пытаюсь использовать TSem для правильной работы, но я продолжаю работать в любом из этих p roblems:
- нить не блокирует вообще, и я в конечном итоге удаления hinotify Бодрствующего, прежде чем он даже начинается, бросая исключение
- поток блокируется на неопределенный срок, в результате чего STM бросить исключение
- программа печатает 3 раза (3 одновременного уведомление), но только длится в течение 1 секунды, а не 10
кода я написал ниже, и может быть проверен on github, чтобы увидеть для себя.
module Main where
import System.INotify
import System.Environment (getArgs)
import Control.Concurrent (forkIO, threadDelay)
import Control.Concurrent.STM
import Control.Concurrent.STM.TSem
import Control.Concurrent.STM.TVar
import Control.Monad (forM_)
main :: IO()
main = do
[file] <- getArgs
-- make changes every 1/10th of a second for 10 seconds
forkIO $ forM_ [0..100] $ \s -> do
appendFile file $ show s
threadDelay (second `div` 10)
debouncer <- atomically $ newTSem 0
notif <- initINotify
expectation <- newTVarIO (0 :: Int)
watcher <- addWatch notif [Modify] file $ \e -> do
e' <- atomically $ do
modifyTVar expectation (+1)
readTVar expectation
print e
threadDelay second
e'' <- readTVarIO expectation
if e' == e''
then atomically $ signalTSem debouncer
else pure()
atomically $ waitTSem debouncer
removeWatch watcher
killINotify notif
second = 1000000
Вы видите что-то сразу же неправильно с тем, что я пытаюсь сделать?