我有一些简单的代码以固定的时间间隔打印到屏幕上,除非IORef
设置为指示用户当前正在输入:
import Data.IORef
import Control.Concurrent
main = do
amTyping <- newIORef False
forkIO $ printALot amTyping
aChar <- getChar
writeIORef amTyping True
aLine <- getLine
writeIORef amTyping False
putStrLn $ aChar : aLine
main
printALot :: IORef Bool -> IO ()
printALot theRef = do
putStrLn "1111111"
threadDelay 1000000
isTyping <- readIORef theRef
if isTyping
then return ()
else printALot theRef
这在 GHCi 中工作得很好,但是当我将它与 runghc 一起使用(或编译它)时,读取或写入IORef
似乎不起作用——printALot
只是继续循环,超出用户键入的任何内容。
ghci 和 runghc/compiled 之间有什么区别?我是不是用IORef
错了,但没有注意到,因为 ghci 不是真正的多线程?