我在 Haskell 中创建一些基本的东西时遇到困难。
我正在尝试创建新线程并向屏幕写入一些内容, sleep ,然后向屏幕写入其他内容。
我认为我应该使用 forkIO,但我不确定如何构建该语句。
提前感谢任何可以提供帮助的人
最佳答案
首先:你的想法是正确的 - 你可以用 forkIO
来做到这一点- 可用于让线程休眠一段时间的函数是 threadDelay
(您必须使用微秒! - 通常只有毫秒秒,所以要小心)
最简单的方法是将 forkIO
直接嵌入到您的计算中(这里是 main
) - 这是一个快速片段,可以按照您的要求进行操作:
module Main where
import Control.Concurrent
main :: IO ()
main = do
putStrLn "press Enter to exit the program"
threadId <- forkIO $ do
putStrLn "Something"
threadDelay 5000000 -- wait 5 seconds
putStrLn "Something Else"
_ <- getLine
return ()
如果您使用-threaded
编译它:
ghc Main.hs -threaded
如果应该打印第一行,则等待 5 秒。最后打印第二行。
备注
- 最后一个
getLine
是作为一个穷人等待线程 - 所以你必须通过按来结束程序(没有这个由于程序以主线程结束,因此不会有任何输出) threadId
是ThreadId
您刚刚启动的线程 - 查看Control.Concurrent
module查看与之交互的一些方法
也许您不喜欢将其放在 main
中 - 如果是这样,您也可以将其重构(这可能会产生更清晰的代码):
main :: IO ()
main = do
putStrLn "press Enter to exit the program"
threadId <- forkIO myThreadComputation
_ <- getLine
return ()
myThreadComputation :: IO ()
myThreadComputation = do
putStrLn "Something"
threadDelay 5000000 -- wait 5 seconds
putStrLn "Something Else"
关于multithreading - Haskell - 创建线程,写入屏幕, sleep 线程,向屏幕写入其他内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477808/