我想从多个线程(4个线程)更新一个。我正在研究一个应用程序,在这个应用程序中,Haskell上的一个事件触发一系列步骤,最终创建线程,如果需要,每个线程都可以并且应该更改Gloss。我使用的是光泽play函数。
Gloss函数类型的play:
play
:: Display
-> Color
-> Int
-> world
-> (world -> Picture)
-> (Event -> world -> world)
-> (Float -> world -> world)
-> IO ()注意参数(Event -> world -> world),它是处理键盘事件的函数。
如果我单击键盘上的x,那么handleKeys::Event -> world -> world捕获这个event,获取一个world(应用程序的一个模型,它是一个由Gloss显示的数据结构),并返回一个world,不管更改与否。
根据handleKeys::Event -> world -> world处理的事件,可以使用forkIO :: IO () -> IO ThreadId生成其他线程。这些生成的线程还应该操作world并返回一个world以供显示。也就是说,每个线程运行一个类型为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并发性的Gloss应用程序来更新GUI?
发布于 2019-01-13 01:37:45
您应该使用来自Graphics.Gloss.Interface.IO.Game的Graphics.Gloss.Interface.IO.Game
https://stackoverflow.com/questions/54141611
复制相似问题