我想从工作线程向UI主线程发送同步事件。我如何在wxWidgets中执行此操作?指向样本的链接非常有用
答案 0 :(得分:7)
您应该使用 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 );
希望这会有所帮助。
答案 1 :(得分: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 :(得分:0)
ProcessEvent - 同步事件处理。 它被声明为 SendMessage 等效。 但是,当我测试它不会切换到widget的线程时,它会在当前线程中处理!
AddPendingEvent 和 QueueEvent - PostMessage 的变体(异步事件处理)。