2017-05-27 7 views
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 

答えて

0

関連する問題