什么是wxWidgets中的SendMessage等效项

时间:2010-09-04 11:00:10

标签: wxwidgets

我想从工作线程向UI主线程发送同步事件。我如何在wxWidgets中执行此操作?指向样本的链接非常有用

3 个答案:

答案 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 的变体(异步事件处理)。