【问题标题】:Window-less event injection into wxWigets event loop using wxHaskell使用 wxHaskell 将无窗口事件注入到 wxWigets 事件循环中
【发布时间】:2017-10-28 08:56:01
【问题描述】:

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

【问题讨论】:

    标签: multithreading haskell wxwidgets wxhaskell


    【解决方案1】:

    在 C++ 级别你可以直接使用wxEventLoop class,但我不知道它是否被 wxHaskell 正确包装。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2017-12-10
      • 2020-10-10
      相关资源
      最近更新 更多