0
もう1つは、HaskellウェイのマルチスレッドとwxWidgetsです。wxHaskellを使用したwxWigetsイベントループへのウィンドウレスイベントインジェクション
私はWXのイベントループ内のコードを実行するために、素敵なハックとしてhttps://stackoverflow.com/a/12596595/4095104を参照してください、私のアプリケーションがある一方で、それは、そのイベントループはそのコースを実行することができるstart
/run
最初にウィンドウを作成し、そこから戻るために私を必要とし本質的にウィンドウレスであり、内部(マルチスレッド)ロジックからの要求に応じてウィンドウを作成することができる。既存のwxWidgetsオブジェクトにバインドされていないループ内に新しいイベントを作成する良い方法はありますか?
編集:コード例:あなただけの直接wxEventLoop classを使用することができますが、それが適切にwxHaskellで包んだ場合、私は知らないC++レベルでは
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