Какой самый чистый способ уведомить GUI об обновлении в wxWidgets?

У меня есть небольшое приложение, которое должно обновлять элементы GUI, если какое-то событие происходит на более низких уровнях, скажем, сокет отключается или что-то в этом роде.

В Windows я мог бы использовать PostMessage, который отправлялся бы через цепочку всем Windows, и требуемые могли обновляться соответственно.

Как мне добиться чего-то похожего в wxWidgets? Я не могу использовать OnUpdateUI, или что-то в этом роде, потому что некоторые элементы управления, кажется, не обрабатывают это вообще.

Целевое окно может быть одним или несколькими, они могут быть кадрами или элементами управления, поэтому я немного запутался здесь.

У кого-нибудь есть предложение?

2 ответа

Во-первых, все элементы управления получают EVT_UPDATE_UI так что вы можете использовать это для этого, и это очень просто сделать - но также и наиболее неэффективно, поэтому определенно не рекомендуется для чего-то вроде обработки событий сокета (это хорошо для проверки, подключен ли сокет или нет).

Во-вторых, точный эквивалент Windows ::PostMessage() является wxQueueEvent() (который раньше назывался wxPostEvent() на самом деле но новая версия предпочтительнее). wxQueueEvent() Потокобезопасен в том смысле, что его можно использовать из вторичного потока для публикации события в элементе управления с графическим интерфейсом, управляемым основным потоком.

Вы можете использовать тот же подход, что и в приложениях Win32. Вы можете создать собственный класс событий и отправить его в окна с помощью функции wxPostEvent. Есть несколько документов по этому поводу.

Не уверен, что вы имеете в виду о wxUpdateUIEvent - по моему опыту, он работает довольно хорошо. Какие элементы управления не получают его? Вы добавили макрос EVT_UPDATE_UI() в таблицу событий?

Другие вопросы по тегам