Как дождаться уничтожения wxDialog?
Как дождаться уничтожения wxDialog?
wxWindow::Destroy запускает отложеное удаление окна и его элементов. Соответственно функция не ждет уничтожения окна. А хотелось бы. Т.к. продолжают приходить сообщения, например wxEVT_KILL_FOCUS, в обработчиках которых используются классы, удаляемые после wxWindow::Destroy. Собственно вопрос: как дождаться гарантированного уничтожения окна?
-
- wxWorld Domination!
- Posts: 1471
- Joined: Tue Nov 14, 2006 7:58 am
- Location: Saint-Petersburg, Russia
Re: Как дождаться уничтожения wxDialo
Привет.
Не понимаю проблемы. Собственно Destroy для того и нужен, что бы безопасно убить окно, если у него еще есть необработанные сообщения в очереди. Если, по каким-то причинам необходимо убить окно без этой лабуды существует delete.SamSam wrote:wxWindow::Destroy запускает отложеное удаление окна и его элементов. Соответственно функция не ждет уничтожения окна. А хотелось бы. Т.к. продолжают приходить сообщения, например wxEVT_KILL_FOCUS, в обработчиках которых используются классы, удаляемые после wxWindow::Destroy. Собственно вопрос: как дождаться гарантированного уничтожения окна?
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Есть класс который создает и уничтожает диалог. Есть объекты неких классов, которые используются в обработчиках сообщений контролов диалога. Диалог уничтожается в диструкторе класа. Далее уничтожаются доп. объекты, но прикол в том что в это время может проскочить каккой-нить event и все испортить(((
-
- wxWorld Domination!
- Posts: 1471
- Joined: Tue Nov 14, 2006 7:58 am
- Location: Saint-Petersburg, Russia
Ну типа того, что ли:SamSam wrote:Есть класс который создает и уничтожает диалог. Есть объекты неких классов, которые используются в обработчиках сообщений контролов диалога. Диалог уничтожается в диструкторе класа. Далее уничтожаются доп. объекты, но прикол в том что в это время может проскочить каккой-нить event и все испортить(((
Code: Select all
...
dialog->Destroy();
delete some_object;
...
Ну это просто дизайн корявый, можно же как-то иначе это делать, ну, например убивать some_object не в деструкторе класса, а в деструкторе самого диалога. Конкретно сказать трудно, вся конструкция неизвестна. Самый простой (не очень элегантный) способ - обнулять указатель на some_object при его удалении (хотя это как посмотреть, может у тебя в диалоге используется некоторая локальная копия указателя на этот объект) и в обработчике диалога проверять его на NULL.
Короче, лучше это просто переделать, что бы диалог не юзал объекты которыми он не владеет и состояния которых он не знает.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
-
- wxWorld Domination!
- Posts: 1471
- Joined: Tue Nov 14, 2006 7:58 am
- Location: Saint-Petersburg, Russia
Не, в WX все правильно. Деструктор диалога вызывается последним. Поэтому самый безопасный способ - удалять объекты, которые юзаются в диалоге, (да это к любому окну относится) в деструкторе самого диалога (ну, либо не удалять их вовсе, если они вообще для диалога внешние, например, глобальные). А у тебя как раз не такSamSam wrote:Вообще есть свои странности в wxWidgets. Ибо если при уничтожении wxDialog мы сначала заходим в деструктор, а потом в обработчик wxWindowDestroyEvent, то это, IMHO, баг)))
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
Вчера породил класс от wxDialog, внедрил в иерархию, проблема практически решилась. В отладке деструктор класса вызывается раньше, чем обработчик wxWindowDestroyEvent. В винде, во всяком случае. Сомневаешься - проверь Глюк отладчика допускаю.tan wrote: Не, в WX все правильно. Деструктор диалога вызывается последним. Поэтому самый безопасный способ - удалять объекты, которые юзаются в диалоге, (да это к любому окну относится) в деструкторе самого диалога (ну, либо не удалять их вовсе, если они вообще для диалога внешние, например, глобальные). А у тебя как раз не так