簡體   English   中英

使用wxHaskell將無窗口事件注入到wxWigets事件循環中

[英]Window-less event injection into wxWigets event loop using wxHaskell

Haskell-way多線程和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

在C ++級別,您可以直接使用wxEventLoop類 ,但是我不知道wxHaskell是否正確包裝了該類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM