multithreading - Haskell - 创建线程,写入屏幕, sleep 线程,向屏幕写入其他内容

标签 multithreading haskell

我在 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是作为一个穷人等待线程 - 所以你必须通过按来结束程序(没有这个由于程序以主线程结束,因此不会有任何输出)
  • threadIdThreadId您刚刚启动的线程 - 查看 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/

相关文章:

haskell - 使用 DuplicateRecordFields 创建镜头

haskell - 理解 `bracket`函数

java - 有没有办法使用 RxJava 让方法在多个线程上运行

java - 如何每秒移动 jlabel?

c++ - 同时使用多个线程C++

java - 如何保持监听器线程 Activity

c++ - 使用 IO_Service 已经创建的线程效率更高

haskell - 如何在haskell中修复 "parse error on input"?

haskell - 为什么 `($ 4) (> 3)` 等同于 `4 > 3` ?

haskell - 如何从另外两个数据创建数据?