作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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
的同一线程内.
postGUI*
每次访问它的功能。但是,当我更改
mainAxn
的最后一行时成为
forkIO mainGUI
return ()
mainAxn
结尾时立即返回.我试图通过使用来解决这个问题:
forkIO mainGUI
forever $ return ()
最佳答案
这里的基本问题是,在 Haskell 中,只要 main
退出,整个程序被拆除。解决方案是简单地保留 main
线程打开;例如
done <- newEmptyMVar
forkOS (mainGUI >> putMVar done ())
takeMVar done
forkIO
与
forkOS
. GTK 在 Windows 上使用(OS-)线程本地状态,因此作为防御性编程问题,最好确保
mainGUI
在绑定(bind)线程上运行,以防万一有一天您想支持 Windows。
关于多线程和 gtk2hs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30737397/
我是一名优秀的程序员,十分优秀!