控制线程退出haskell应用程序

sip*_*wiz 3 io concurrency haskell asynchronous

我是Haskell的新手,并且在处理一些样本时,我遇到了一个无法阻止程序的问题.我正在使用Windows 7并使用ght的runhaskell.Ctrl-c不起作用所以我不得不求助于任务管理器,这有点痛苦.

而不是这样做我怎么能创建一个单独的控制线程,等待我输入q然后退出我的Haskell应用程序.

我遇到问题的应用程序的格式是:

main = do
 h <- connectTo server (PortNumber (fromInteger port))
 hSetBuffering h NoBuffering
 ... do some stuff with the socket handle ...
 listen h

listen :: Handle -> IO ()
listen h = forever $ do
  t <- hGetLine h
  let s = init t
  putStrLn s
where
  forever a = do a; forever a
Run Code Online (Sandbox Code Playgroud)

在伪代码中,我想要的是:

main = do
  waitForQuit
  ... original program ...

waitForQuit :: IO()
   option <- getChar
   if option == 'q' then
     ... kill the app ... 
   else 
     waitForQuit
Run Code Online (Sandbox Code Playgroud)

Tho*_*son 5

您应该能够使用Haskell线程,getChar并退出{With,Success,Failure}.

import Control.Concurrent
import System.Exit
import Data.Char (toLower)
import System.IO

main = do
    forkIO realMain
    exitOnQ

exitOnQ = do
    hSetBuffering stdin NoBuffering
    c <- getChar
    when (toLower c /= 'q') exitOnQ
    exitSuccess  -- or "exitWith" and some ExitCode value, use hoogle.
Run Code Online (Sandbox Code Playgroud)

打破这一点:你可以同时通过forkIO.请注意,这不是一个单独的OS线程,而是一个非常轻量级的Haskell线程.该exitOnQ线程需要得到击键毫不拖延-没有NoBuffering你不得不打Q- [ENTER].如果按下的键不是q(或Q),那么我们循环,否则我们通过许多exit*调用之一终止程序.

警告:这是一个非常罕见的极端情况,但GHC使用GC点作为线程调度点(这在过去两年中有所改变吗?)因此如果您的代码花费大量时间执行大量纯零计算的纯计算,那么你不能使用这种方法退出(除非你有多个操作系统线程通过线程RTS 一个+RTS -N#选项).