另一个对 Haskell 方式的多线程和 wxWidgets 的看法。
我认为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