Уведомления в wxWidgets? - PullRequest
3 голосов
/ 02 января 2009

Я работаю над небольшим приложением, использующим C ++ / wxWidgets, где необходимо обновить несколько частей графического интерфейса на основе, например, полученные UDP дейтаграммы. Более конкретно, вторичный поток пытается сохранить список доступных «клиентов» в сети (которые могут приходить и уходить) и, например, соответствующие комбинированные списки в пользовательском интерфейсе необходимо обновить, чтобы отразить изменения.

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

Однако, я бы чувствовал себя более комфортно, используя более прямой подход, то есть где, например, оконный объект может регистрироваться / подписываться для получения уведомлений (либо событий, либо обратных вызовов) на определенные события, и другая часть кода отправляет эти уведомления, когда это необходимо. Я мог бы сделать это в C ++, используя свой собственный код, однако я думаю, что если wxWidgets уже поддерживает что-то подобное, я должен использовать это. Однако я не нашел ничего в этом отношении.

Итак, вопрос в том, поддерживает ли wxWidgets такую ​​систему уведомлений (или аналогичные альтернативы), или мне лучше будет написать свое собственное?

Ответы [ 2 ]

1 голос
/ 02 января 2009

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

Что бы я сделал:

  • Создайте класс wxEvtHandler-descendent для хранения списка доступных «клиентов» в сети. Пусть этот класс имеет wxCriticalSection и использует для этого wxCriticalSectionLocker во всех методах, которые добавляют или удаляют «клиентов».

  • Создайте класс рабочего потока, унаследовав wxThread для обработки ваших дейтаграмм UDP, используя блокирующие вызовы. Поток должен напрямую вызывать методы объекта списка клиентов всякий раз, когда клиент должен быть добавлен или удален. В этих методах обновите список клиентов и :: wxPostEvent () событие для себя (при этом будут выполняться все вызовы уведомлений в основном потоке графического интерфейса).

  • Обработайте событие в классе списка клиентов и уведомите всех слушателей, что список клиентов изменился. Схема наблюдателя кажется мне подходящей. Вы можете либо вызвать метод всех зарегистрированных слушателей напрямую, либо отправить им wxCommandEvent.

0 голосов
/ 17 апреля 2009

Вы пытались вызвать Update () для виджетов, которые меняются? Как только вы обновите содержимое поля со списком, вызовите Update (), и содержимое должно обновиться.

...