0
Haskell-way多線程和wxWidgets的另一個問題。使用wxHaskell注入wxWigets事件循環的無窗口事件
我看到https://stackoverflow.com/a/12596595/4095104作爲一個很好的黑客運行在WX事件循環代碼,但它需要我start
/run
首先要創建一個窗口,從它返回,因此事件循環可以自生自滅,而我的應用程序是基本上不需要窗口,並且可以根據內部(多線程)邏輯的需求創建窗口。有沒有一種好的方法可以在循環中創建一個不綁定到任何已有的wxWidgets對象的新事件?
編輯:代碼示例:
import Graphics.UI.WX as WX
import Graphics.UI.WXCore as WXCore
import Control.Concurrent
-- | cf. http://snipplr.com/view/17538/
myEventId :: Int
myEventId = WXCore.wxID_HIGHEST+100
-- the custom event ID, avoid clash with Graphics.UI.WXCore.Types.varTopId
-- | the custom event is registered as a menu event
createMyEvent :: IO (WXCore.CommandEvent())
createMyEvent =
WXCore.commandEventCreate WXCore.wxEVT_COMMAND_MENU_SELECTED myEventId
registerMyEvent :: WXCore.EvtHandler a -> IO() -> IO()
registerMyEvent win io =
WXCore.evtHandlerOnMenuCommand win myEventId io
doesntwork = do
handler <- newEmptyMVar
start $ do
app <- wxcAppGetApp
event <- createMyEvent
mvar <- newEmptyMVar
registerMyEvent app $ do
str <- takeMVar mvar
putStrLn str
putMVar handler (app, event, mvar)
(app, event, mvar) <- takeMVar handler
putMVar mvar "hack"
WXCore.evtHandlerAddPendingEvent app event
threadDelay 10000000000
works = do
handler <- newEmptyMVar
start $ do
app <- wxcAppGetApp
event <- createMyEvent
mvar <- newEmptyMVar
registerMyEvent app $ do
str <- takeMVar mvar
putStrLn str
putMVar handler (app, event, mvar)
putMVar mvar "hack"
WXCore.evtHandlerAddPendingEvent app event
(app, event, mvar) <- takeMVar handler
threadDelay 10000000000
main = doesntwork