Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 来自线程之间共享通信通道的事件_Multithreading_Haskell_Reactive Banana - Fatal编程技术网

Multithreading 来自线程之间共享通信通道的事件

Multithreading 来自线程之间共享通信通道的事件,multithreading,haskell,reactive-banana,Multithreading,Haskell,Reactive Banana,我有一个解决一些问题的程序,我决定用一个漂亮的GUI来监视它的功能。对于GUI,我选择了Gtk,这意味着我需要在一个专用线程中运行mainGUI循环,程序的其余部分将占用另一个线程。我认为我的程序和另一个线程之间的通信将使用Chan朝一个方向流动。我进一步决定使用FRP在工作人员发出通知时更新GUI(原始程序的逻辑在其单独的线程中)。因此,我尝试编写一个简单的线程示例,其中一个线程将IO操作发送到执行这些操作(显示它们)的监视线程。以下是我的尝试: import Control.Concurre

我有一个解决一些问题的程序,我决定用一个漂亮的GUI来监视它的功能。对于GUI,我选择了
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"