我的职责是:
type App a = ExceptT AppError (ResourceT IO)
onEvent :: SDL.EventPayload -> App ()
onEvent event = do
liftIO $ putStrLn "EVE!"
case event of
SDL.MouseMotionEvent dat -> do
liftIO $ putStrLn "HELLO"
SDL.KeyboardEvent kbe -> liftIO $ putStrLn "WORLD"
_ -> return ()这是在我的应用程序中使用的回调。
这个函数似乎不会触发,因为没有任何putStrLn的打印到控制台。
但是这个函数--只要稍加修改,就可以打印出控制台上的所有内容:
onEvent :: SDL.EventPayload -> App ()
onEvent event = do
liftIO $ putStrLn "EVE!"
case event of
SDL.MouseMotionEvent dat -> do
liftIO $ print dat
SDL.KeyboardEvent kbe -> liftIO $ print kbe
_ -> return ()为什么对SDL.EventPayload的全面评估会导致周围的putStrLn工作?
如何使我的函数回调更可靠一些?
发布于 2016-07-26 21:04:53
正如托马斯在评论中指出的那样,这看起来像是一个缓冲问题。System.IO包描述了标准的缓冲行为。
关于如何解决这类问题,您有几个选择。您可以使用以下方法手动设置程序中的缓冲模式:
hSetBuffering stdout NoBuffering在你开始工作的时候。这将关闭所有缓冲(您也可以选择LineBuffering),并将立即打印到stdout。
还可以在每次打印后刷新缓冲区:
SDL.MouseMotionEvent dat -> do
liftIO $ putStrLn "HELLO"
hFlush stdout或者,您可以尝试直接打印到具有不同默认缓冲规则的stderr句柄:
SDL.MouseMotionEvent dat -> do
liftIO $ hPutStrLn stderr "HELLO"https://stackoverflow.com/questions/38583178
复制相似问题