gpt4 book ai didi

haskell - 控制线程退出haskell应用程序

转载 作者:行者123 更新时间:2023-12-02 16:49:49 25 4
gpt4 key购买 nike

我是 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

在伪代码中我想要的是:

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

waitForQuit :: IO()
option <- getChar
if option == 'q' then
... kill the app ...
else
waitForQuit

最佳答案

您应该能够使用 Haskell 线程、getChar 和 exit{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.

分解:您可以通过 forkIO 获得并发。请注意,这不是一个单独的操作系统线程,而是一个非常轻量级的 Haskell 线程。 exitOnQ 线程需要立即获得击键 - 如果没有 NoBuffering,您必须按 q-[ENTER]。如果按下的键不是 q (或 Q),则我们循环,否则我们通过众多 exit* 调用之一终止程序.

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

关于haskell - 控制线程退出haskell应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com