我正在使用 Pipes.Concurrent 用 GTK 编写一个简短的 GUI 程序。这是一个扫雷游戏,所以我正在构建一个按钮网格。
我构建并连接我的按钮:
b <- buttonNewWithLabel (show $ adjacencies board ! i)
on b buttonActivated
$ void . atomically $ send output (ClickSignal i (mines board ! i))
return b
我将管道连接到:
(output, input) <- spawn (latest (ClickSignal 0 False))
let run = do
sig <- await
case sig of
ClickSignal i isMine ->
if isMine
then do
lift $ labelSetText info (show i ++ " -- LOSE!")
else do
lift $ labelSetText info (show i ++ " -- Ok")
run
Empty -> do
lift $ labelSetText info "Empty Case"
run
void . forkIO $ do
runEffect $ fromInput input >-> run
performGC
它几乎按预期运行。但是如果我点击按钮 1,什么都不会发生。但是如果我按下按钮 23,它会将信息标签更新为“1..”。如果我单击另一个按钮,它将更新为“23..”,依此类推。
我怀疑要么我无法理解并发管道是如何在某个级别上工作的,要么是惰性 IO 正在做一些奇怪的事情。