我有一个GUI和一个工作线程,我想将数据从工作人员发送到GUI。我正在使用QueueEvent和wxThreadEvents来保持模型视图分离。我以某种方式得到了一个baadf00d错误。
const int EvtID = 42;
MyFrame::MyFrame()
{
...
// this seems to work correctly,
// but I'm including it in case it is part of the problem
Bind(wxEVT_THREAD, (wxObjectEventFunction)&MyFrame::OutputData, this, EvtID);
...
}
MyFrame::OutputData(wxThreadEvent* event)
{
// should get data from MyThread,
// but outputs 0xBA, 0xAD, 0xF0, 0x0D in successive calls
output << event->GetInt();
}
MyThread::CreateOutputWithLocal()
{
wxThreadEvent event(wxEVT_THREAD, EvtID);
event.SetInt(getData());
//pFrame is a wxEvtHandler*
pFrame->QueueEvent(event.Clone());
}
MyThread::CreateOutputWithPointer()
{
wxThreadEvent* event = new wxThreadEvent(wxEVT_THREAD, EvtID);
event->SetInt(getData());
//pFrame is a wxEvtHandler*
pFrame->QueueEvent(event); // QueueEvent() takes control of the pointer and deletes it
}
使用wxThreadEvent
的{{1}}和SetPayload()
或其GetPayload()
和SetExtraLong()
似乎没有任何区别。我需要什么才能让它发挥作用?
答案 0 :(得分:1)
Set / GetPayload应该可以解决问题。可能是你错了。您的代码将提供更多帮助。但这里有一个剥离的例子,显示了两种方法的用法。
Connect(wxID_ANY, wxEVT_COMMAND_DATA_SENT, wxThreadEventHandler(GMainFrame::OnAddText), NULL, this);//connect event to a method
void* MyThread::Entry(){
wxThreadEvent e(wxEVT_COMMAND_DATA_SENT);//declared and implemented somewhere
wxString text("I am sent!");
e.SetPayload(wxString::Format("%s", text.c_str()));
theParent->GetEventHandler()->AddPendingEvent(e);
return NULL;
}
void GMainFrame::OnAddText(wxThreadEvent& event) {
wxString t = event.GetPayload<wxString>();
wxMessageBox(t);
}
我在很久以前玩wxThreadEvent时写的样本的剥离版本
答案 1 :(得分:0)
在您的情况下,我只是将工资负载存储在属于该框架的线程安全队列中。
在排队事件之前,将数据排入线程安全队列。在OutputData函数中,刷新队列并读取其中的数据。
我正在使用此策略将boost::function < void () >
传递给UI,因此它非常易于使用,因为我几乎可以从引擎线程中触发任何内容。