Что такое эквивалент SendMessage в wxWidgets - PullRequest
4 голосов
/ 04 сентября 2010

Я хочу отправить синхронное событие из рабочего потока в основной поток пользовательского интерфейса. Как мне это сделать в wxWidgets? Ссылка на образец будет очень полезна

Ответы [ 3 ]

7 голосов
/ 02 ноября 2010

Вы должны использовать 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 ); 

Надеюсь, это поможет.

1 голос
/ 05 сентября 2010

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);

Относительно того, как использовать это из рабочего потока - вы бы предпочли взглянуть на очередь заданий http://wxforum.shadonet.com/download.php?id=673

0 голосов
/ 06 сентября 2013

ProcessEvent - синхронная обработка событий.Он объявлен как SendMessage эквивалент.Но, как я уже проверял, он НЕ переключается на поток виджета, он обрабатывается в текущем потоке!

AddPendingEvent и QueueEvent - варианты PostMessage (обработка асинхронных событий).

...