实现一个简单的 Timer
2017-07-10 本文已影响159人
Lupino
使用 haskell 重新写 Periodic task system 时,我找不到一个合适的 timer
于是我就自己实现了一个。
data Timer = Timer { waiter :: MVar () }
newTimer :: IO Timer
newTimer = Timer <$> newEmptyMVar
Timer
初始化一个空的 waiter
initTimer :: Timer -> IO () -> IO ()
initTimer (Timer {..}) io = do
void $ forkIO $ forever $ do
takeMVar waiter
io
初始化 Timer
时使用 forever
让执行的 io
进入死循环,并用 MVar
的特性让 io
进行等待。
startTimer :: Timer -> Int -> IO ()
startTimer (Timer {..}) delay = do
void $ forkIO $ do
threadDelay delay
putMVar waiter ()
开始 Timer
时 forkIO
出一个 thread
, 利用 threadDelay
等待相应的时间后 解锁 waiter
这样子一个简单的 Timer
就出来了。
完整的代码见:Timer.hs
也欢迎读者们来 star
Periodic task system