Multithreading 来自线程之间共享通信通道的事件
我有一个解决一些问题的程序,我决定用一个漂亮的GUI来监视它的功能。对于GUI,我选择了Multithreading 来自线程之间共享通信通道的事件,multithreading,haskell,reactive-banana,Multithreading,Haskell,Reactive Banana,我有一个解决一些问题的程序,我决定用一个漂亮的GUI来监视它的功能。对于GUI,我选择了Gtk,这意味着我需要在一个专用线程中运行mainGUI循环,程序的其余部分将占用另一个线程。我认为我的程序和另一个线程之间的通信将使用Chan朝一个方向流动。我进一步决定使用FRP在工作人员发出通知时更新GUI(原始程序的逻辑在其单独的线程中)。因此,我尝试编写一个简单的线程示例,其中一个线程将IO操作发送到执行这些操作(显示它们)的监视线程。以下是我的尝试: import Control.Concurre
Gtk
,这意味着我需要在一个专用线程中运行mainGUI
循环,程序的其余部分将占用另一个线程。我认为我的程序和另一个线程之间的通信将使用Chan
朝一个方向流动。我进一步决定使用FRP在工作人员发出通知时更新GUI(原始程序的逻辑在其单独的线程中)。因此,我尝试编写一个简单的线程示例,其中一个线程将IO
操作发送到执行这些操作(显示它们)的监视线程。以下是我的尝试:
import Control.Concurrent
import Control.Monad
import Reactive.Banana
import Reactive.Banana.Frameworks
main = do
c <- newChan
forkIO $ do
actuate <=< compile $ reactimate'
<=< changes
<=< fromPoll
$ readChan c
forever $ do
threadDelay 3000000
putStrLn "sending msg"
writeChan c $ putStrLn "receiving msg"
当线程显式(可能阻塞)读取c::Chan(IO())
中的每条消息时,对消息进行反应式处理,即描述与GUI元素互连的事件/行为网络,然后让线程执行GUI循环。网络需要处理通道中的轮询值和触发事件
我正在寻求的解决方案(或类似的解决方案):
main=do
(msgHandler,msgFire)来自Poll的文档说明
每当事件网络处理输入事件时,结果行为都将在上更新
因为没有事件,所以它永远不会更新fromPoll
旨在作为一种快速而肮脏的方式来读取可变数据,但不用于更新网络。相反,文档建议我们使用fromChanges
。但是因为我们或者,因为我们想要事件
,所以我们还是使用,这似乎非常合适:它允许我们创建一个事件
,我们通过调用处理程序
(这是a->IO()
的别名)向其添加值
导入控制。并发
进口管制
进口香蕉
导入Reactive.Banana.Frameworks
main=do
c这可能会有帮助:谢谢,我对FRP部分感到困惑,而不是通道。
main = do
c <- newChan
forkIO . forever . join . readChan $ c
forever $ do
threadDelay 3000000
putStrLn "sending msg"
writeChan c $ putStrLn "receiving msg"
main = do
(msgHandler, msgFire) <- newAddHandler
forkIO $ do
actuate <=< compile $ do
eMsg <- fromAddHandler msgHandler
reactimate $ putStrLn <$> eMsg
forever $ do
threadDelay 3000000
putStrLn "sending msg"
msgFire "receiving msg"
import Control.Concurrent
import Control.Monad
import Reactive.Banana
import Reactive.Banana.Frameworks
main = do
c <- newChan
network <- compile $ do
(event, handler) <- newEvent
liftIO $ forkIO $ forever (readChan c >>= handler)
reactimate event
forkIO $ actuate network
forever $ do
threadDelay 3000000
putStrLn "sending msg"
writeChan c $ putStrLn "receiving msg"