1

我想从多个线程(4 个线程)更新 Haskell Gloss GUI。我正在研究一个应用程序,其中 Haskell GlossGUI 上的事件触发一系列步骤,最终创建线程,每个线程都可以并且应该在需要时更改 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 应用程序?

4

1 回答 1

1

你应该使用 Graphics.Gloss.Interface.IO.Game 的 playIO

于 2019-01-13T01:37:45.470 回答