我想每隔n
秒运行一个程序并刷新屏幕(某些行)直到我按下q
键。怎么做到这一点?
我已检查ansi-terminal
包以刷新屏幕的某些部分。我猜我应该使用haskeline
来获取循环和用户按键。我是对的吗?
如果是,我无法在haskeline中找到该功能。
答案 0 :(得分:2)
除IO
来自threadDelay
Control.Concurrent
的{{1}} Monad外,你可以做到这一点。
import Control.Concurrent
refreshInterval :: Int
refreshInterval = 10000 -- in microseconds
refreshAction :: IO ()
refreshAction = undefined
main :: IO ()
main = do refreshAction
threadDelay refreshInterval
main
使用此结构,您现在可以通过任何为您提供键盘输入的库来合并键盘退出。例如,使用haskeline,您可以使用getInputChar
读取输入,将其与退出字符进行比较,并在必要时退出。但是直接这样做会让你在线程与threadDelay
一起睡觉时无法读取输入。如果你的输入库缓冲读取,这可能没问题 - 当程序到处检查输入时,就会发生退出/中断操作。如果您需要更多,可以按照评论中的建议通过forkIO
推送自己的解决方案,或者移动到更好地处理此类事情的库。
作为一个有趣的附注,我可以使用包含OpenCV的HighGUI功能的库部分在我的OpenCV库中轻松解决这个问题。我不一定建议仅为此功能提供依赖性,但它在技术上解决了您的问题。如果有人有兴趣,我会在这个答案中添加。