如何使用wxThreadEvent从线程传递数据?

时间:2012-11-05 21:44:08

标签: c++ multithreading wxwidgets

我有一个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()似乎没有任何区别。我需要什么才能让它发挥作用?

2 个答案:

答案 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,因此它非常易于使用,因为我几乎可以从引擎线程中触发任何内容。