Haskell - 创建线程,写入屏幕,睡眠线程,将其他内容写入屏幕

时间:2016-02-18 09:42:25

标签: multithreading haskell

我在Haskell中创建基本的东西时遇到了困难。

我正在尝试创建新线程并在屏幕上写入内容,睡眠,然后在屏幕上写下其他内容。

我想我应该使用forkIO,但我不确定如何构造语句。

提前感谢任何可以提供帮助的人

1 个答案:

答案 0 :(得分:5)

首先:您的想法是正确的 - 您可以使用forkIO执行此操作 - 您可以使用的功能让您的线程暂时休眠threadDelay(您必须使用 micro < / em>秒! - 通常只有 milli 秒,所以要注意)

最简单的方法是将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"