【发布时间】:2011-04-08 04:53:03
【问题描述】:
我想将同步事件从工作线程发送到 UI 主线程。我如何在 wxWidgets 中做到这一点?指向示例的链接将非常有帮助
【问题讨论】:
标签: wxwidgets
我想将同步事件从工作线程发送到 UI 主线程。我如何在 wxWidgets 中做到这一点?指向示例的链接将非常有帮助
【问题讨论】:
标签: wxwidgets
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
【讨论】:
您应该使用 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 );
希望这会有所帮助。
【讨论】:
GetEventHandler() 返回的指针上调用 ProcessEvent() 而不是 wxWindow 对象本身。跨度>
ProcessEvent - 同步事件处理。 它被声明为 SendMessage 等效项。 但是当我测试它不会切换到小部件的线程时,它会在当前线程中处理!
AddPendingEvent 和 QueueEvent - PostMessage 的变体(异步事件处理)。
【讨论】: