Что может заставить wxFrame :: Destroy () ничего не разрушать? - PullRequest
0 голосов
/ 06 декабря 2018

Я абсолютно осознаю тот факт, что нет ясного решения для моего вопроса, поэтому я не спрашиваю, почему он не работает, а каково предполагаемое поведение / как указана текущая реализация для работы:

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

Теперь при некоторых условиях это не работает: я могу выполнить wxFrame :: Destroy (), это происходит так же, как обычно, но впоследствии нетвызывается desctructor, приложение остается активным и видимым.Я могу попытаться закрыть / вызвать wxFrame :: Destroy () несколько раз в этой ситуации, результат всегда один и тот же, приложение остается живым, а все окна по-прежнему видны и доступны для использования.

Я лично предположил бы,это связано с одним из моих подэлементов, но я понятия не имею, какой / что может вызвать такое поведение.

Итак, мой вопрос: как работает wxFrame :: Destroy (), под какимусловия будут отклонять такой вызов и не будут уничтожать связанный wxFrame?

1 Ответ

0 голосов
/ 06 декабря 2018

wxFrame::Destroy() не уничтожает окно сразу, оно просто помечает его для удаления, которое фактически произойдет во время следующей итерации цикла сообщений, после обработки всех ожидающих сообщений (это важно, поскольку некоторые из этих ожидающих сообщений могут иметьобработчики, ссылающиеся на кадр, который должен быть удален).Поэтому наиболее распространенное объяснение проблемы, подобной той, которую вы описываете, состоит в том, что есть нечто, генерирующее события быстрее, чем они могут быть обработаны, и поэтому цикл сообщений никогда не становится бездействующим.

Например, в более старых версияхиз wxWidgets это может произойти с wxEVT_PAINT событиями в MSW, если вы не перерисовали все окна должным образом, то есть не создали wxPaintDC в своем обработчике рисования.В wxWidgets 3 добавлены некоторые обходные пути, которые предотвращают возникновение этого точного сценария, но все же может произойти что-то немного более сложное.

Для отладки может быть полезно запустить приложение Spy ++ и проверить, видите ли вы бесконечныйпоток сообщений Windows в окна вашего приложения.

...