我想从多个线程(4 个线程)更新 Haskell Gloss GUI。我正在研究一个应用程序,其中 Haskell Gloss
GUI 上的事件触发一系列步骤,最终创建线程,每个线程都可以并且应该在需要时更改 GUI。我正在使用光泽play
功能。
Gloss GUI 函数play
类型:
play
:: Display
-> Color
-> Int
-> world
-> (world -> Picture)
-> (Event -> world -> world)
-> (Float -> world -> world)
-> IO ()
注意(Event -> world -> world)
处理键盘事件的函数的参数。
如果我单击键盘上的xhandleKeys::Event -> world -> world
,然后捕获 this event
,获取 a world
(我的应用程序模型,它是 Gloss 显示的数据结构)并返回world
有或没有更改的 a。
根据handleKeys::Event -> world -> world
其他线程处理的事件,可能会使用forkIO :: IO () -> IO ThreadId
. 这些产生的线程还应该操作world
并返回 aworld
以供显示。也就是说,每个线程运行一个类型的函数world->world
。然后我会使用 STM 原语进行并发。这些原语是:
putTMVar :: TMVar a -> a -> STM ()
takeMVar :: MVar a -> IO a
atomically :: STM a -> IO a
retry :: STM a
orElse :: STM a -> STM a -> STM a
正如你已经猜到的那样,Haskell 类型检查器让我头痛。是否有可能在不违反类型的情况下运行依赖 STM 并发更新 GUI 的 Gloss 应用程序?