Вы должны использовать QueueEvent (событие wxEvent *) для связи между потоками.
void wxEvtHandler::QueueEvent(wxEvent* event)
wxДокументированные состояния:
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 );
Надеюсь, это поможет.