gpt4 book ai didi

多线程和 gtk2hs

转载 作者:行者123 更新时间:2023-12-03 12:52:14 24 4
gpt4 key购买 nike

我正在用 react 香蕉和 gtk2hs 编写一些需要从文件句柄中读取的代码。我需要至少有两个线程(一个用 react 香蕉读取键盘事件,一个从文件句柄读取),所以目前我的代码看起来像这样:

type EventSource a = (AddHandler a, a -> IO ())

fire :: EventSource a -> a -> IO ()
fire = snd

watch :: EventSource ByteString -> Handle -> IO ()
watch textIn pty = forever $
hGetLine pty >>= fire textIn >> threadWaitRead pty

具有以下主要功能:
mainAxn :: IO ()
mainAxn = do
h <- openFile "foo" ReadMode

initGUI

win <- windowNew
txt <- textViewNew

containerAdd win txt

widgetShowAll win

(keyPress, textIn) <-
(,) <$> newAddHandler <*> newAddHandler
network <- setupNetwork keyPress textIn
actuate network

_ <- forkIO $ watch textIn h

_ <- win `on` keyPressEvent $
eventKeyVal >>= liftIO . fire keyPress >> return True

mainGUI

我的事件网络设置如下:
setupNetwork :: EventSource KeyVal -> EventSource ByteString -> IO EventNetwork
setupNetwork keyPress textIn = compile $ do
ePressed <- fromAddHandler $ addHandler keyPress
eText <- fromAddHandler $ addHandler textIn

reactimate $ print <$> (filterJust $ keyToChar <$> ePressed)
reactimate $ print <$> eText

(除了在我的实际代码中,那些 reactimate 调用写入 TextView 内置的 mainAxn )。我发现我需要用 -threaded 构建使事件网络正确捕获 textIn 中的两个文本和来自 keyPress 的按键,这会导致问题,因为同时修改 gtk 包中的对象是不安全的。

目前,我有 postGUIAsync调用分散在我的代码中,我发现使用 postGUISync导致整个事情陷入僵局——我不知道为什么。我想这是因为我最终调用 postGUISync在运行 mainGUI 的同一线程内.

似乎最好在自己的线程中运行所有 GUI 内容并使用 postGUI*每次访问它的功能。但是,当我更改 mainAxn 的最后一行时成为
forkIO mainGUI
return ()

程序在到达 mainAxn 结尾时立即返回.我试图通过使用来解决这个问题:
forkIO mainGUI 
forever $ return ()

但是 gtk GUI 根本没有打开,我不明白为什么。

这样做的正确方法是什么?我错过了什么?

最佳答案

这里的基本问题是,在 Haskell 中,只要 main退出,整个程序被拆除。解决方案是简单地保留 main线程打开;例如

done <- newEmptyMVar
forkOS (mainGUI >> putMVar done ())
takeMVar done

我也替换了 forkIOforkOS . GTK 在 Windows 上使用(OS-)线程本地状态,因此作为防御性编程问题,最好确保 mainGUI在绑定(bind)线程上运行,以防万一有一天您想支持 Windows。

关于多线程和 gtk2hs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30737397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com