【问题标题】:What is the SendMessage Equivalent in wxWidgetswxWidgets 中的 SendMessage 等价物是什么
【发布时间】:2011-04-08 04:53:03
【问题描述】:

我想将同步事件从工作线程发送到 UI 主线程。我如何在 wxWidgets 中做到这一点?指向示例的链接将非常有帮助

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

    AddPendingEvent - 此函数发布一个事件以供稍后处理。 http://docs.wxwidgets.org/2.8/wx_wxevthandler.html#wxevthandleraddpendingevent

    ProcessEvent - 处理事件、搜索事件表并调用零个或多个合适的事件处理函数。 http://docs.wxwidgets.org/2.8/wx_wxevthandler.html#wxevthandlerprocessevent

    wxFrame * frame = new wxFrame(...);
    ...
    wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, ID_MY_BUTTON);
    frame->AddPendingEvent(event);
    

    关于如何从工作线程中使用它 - 你宁愿看看 Job Queue http://wxforum.shadonet.com/download.php?id=673

    【讨论】:

      【解决方案2】:

      您应该使用 QueueEvent(wxEvent* event) 进行线程间通信。

      void wxEvtHandler::QueueEvent(wxEvent* event)

      wxDocumentation 状态:

      QueueEvent() 可以用于工作线程到主线程的线程间通信,在内部使用锁定的意义上是安全的,避免了中提到的问题AddPendingEvent() 文档,确保调用线程不再使用事件对象。仍应注意避免此对象的某些字段被它使用,特别是事件对象的任何 wxString 成员不得是另一个 wxString 对象的浅拷贝,因为这将导致他们仍然在幕后使用相同的字符串缓冲区。

      你可以这样做:

      wxCommandEvent* evt = new wxCommandEvent();
      
      // NOT evt->SetString(str) as this would be a shallow copy
      evt->SetString(str.c_str()); // make a deep copy
      
      wxTheApp->QueueEvent( evt ); 
      

      希望这会有所帮助。

      【讨论】:

      • 作为附录:此函数在 wxEvtHandler 中是公共的,但在 wxWindow 中是受保护的,因为对于 wxWindows,您应该始终在 GetEventHandler() 返回的指针上调用 ProcessEvent() 而不是 wxWindow 对象本身。跨度>
      【解决方案3】:

      ProcessEvent - 同步事件处理。 它被声明为 SendMessage 等效项。 但是当我测试它不会切换到小部件的线程时,它会在当前线程中处理!

      AddPendingEventQueueEvent - PostMessage 的变体(异步事件处理)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        • 2014-05-08
        • 2014-06-12
        • 1970-01-01
        • 2022-11-28
        • 2021-06-19
        • 2012-07-20
        相关资源
        最近更新 更多