2

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
}

wxThreadEventSetPayload()andGetPayload()またはそのSetExtraLong()andを使用GetExtraLong()しても違いはないようです。これを機能させるには何が必要ですか?

4

2 に答える 2

1

Set/GetPayload でうまくいくはずです。やり方が間違っているのかもしれません。あなたのコードはもっと役に立ちます。しかし、Two メソッドの使用法を示す単純な例を次に示します。

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 をいじっていたときに書いたサンプルから削除されたバージョン

于 2012-11-06T07:18:46.483 に答える
0

あなたの場合、フレームに属するスレッドセーフキューにペイロードを保存するだけです。

イベントをキューに入れる前に、データをスレッドセーフキューに入れます。OutputData関数で、キューをフラッシュし、キューにあるデータを読み取ります。

この戦略を使用boost::function < void () >してUIに渡すので、エンジンスレッドからほとんどすべてをトリガーできるため、非常に呼び出し可能です。

于 2012-11-15T14:40:44.707 に答える