Странное поведение wxWindow::Destroy()

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
vat_cpp
In need of some credit
In need of some credit
Posts: 3
Joined: Fri Nov 15, 2019 4:31 pm

Странное поведение wxWindow::Destroy()

Post by vat_cpp »

wxw 3.0.4, Visual Studio 2008, MSW

В документации сказано- не удалать объекты wxWindow (и производные) с помощью стандартного delete, а пользоваться Destroy(), иначе рушится Event Loop и т.д.

В моем проекте часто нужно удалять десятки объектов wxWindow и создавать новые. Сначала пользовался delete по незнанию, приложение часто падало.

Стал пользоваться Destroy, стало лучше, но приложение все равно периодически непредсказуемо падает, причем по дебаггеру видно, что падает явно не в моем коде, а в глубинах библиотеки.
Если вместо Destroy вызывать просто Hide(), то падения прекращаются, но... так мы не освобождаем память.

Как же все таки правильно удалять окна и производные?
На английском встречалось, что destroy удаляет объект безопасно для цикла сообщений только если это top level window. В моем приложении они явно не top level, т.к. их родительское окно само является дочерним для главного окна приложения.
И как быть?..
User avatar
doublemax
Moderator
Moderator
Posts: 19116
Joined: Fri Apr 21, 2006 8:03 pm
Location: $FCE2

Re: Странное поведение wxWindow::Destroy()

Post by doublemax »

First of all: You can not delete any window from a secondary thread. (Just in case you were doing that).

But in general deleting a non-toplevel window with "delete" should be safe. Exception, if you're inside an event handler of a certain window, deleting that window could cause a crash. In that case use wxAppConsole::ScheduleForDestruction()
https://docs.wxwidgets.org/trunk/classw ... 22f9de9d90

If the app still crashes, there must be something else going on.
Use the source, Luke!
vat_cpp
In need of some credit
In need of some credit
Posts: 3
Joined: Fri Nov 15, 2019 4:31 pm

Re: Странное поведение wxWindow::Destroy()

Post by vat_cpp »

doublemax wrote: Fri Nov 15, 2019 5:09 pm First of all: You can not delete any window from a secondary thread. (Just in case you were doing that).
No, my app is single-thread.
doublemax wrote: Fri Nov 15, 2019 5:09 pm In that case use wxAppConsole::ScheduleForDestruction()
Thanks for advice, i'll try.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Странное поведение wxWindow::Destroy()

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
A zachem voobsche nugno udalyat okna? Oni sami udalyayutsja...

Kod mogno posmotret?

Spasibo.
alys666
Super wx Problem Solver
Super wx Problem Solver
Posts: 329
Joined: Tue Oct 18, 2016 2:31 pm

Re: Странное поведение wxWindow::Destroy()

Post by alys666 »

сомнительно что destroy не может верно убить окно.
там ж ничего сложного по функциональности нет.
его надо поудалять из всех возможных списков, удалить из парента и просто вызвать delete.
единственно проблемный случай - это то, что сказал даблмакс. когда удаление вызывается синхронно из обработки событий для самого окна. тогда удаление надо откладывать...ну вот как даблмакс и сказал, или другим способом, типа CallAfter(...). хотя думаю в wxAppConsole::ScheduleForDestruction, СallAfter и используется.
ubuntu 20.04, wxWidgets 3.2.1
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Странное поведение wxWindow::Destroy()

Post by ONEEYEMAN »

Доброго времени суток,
А зачем его вообще удалять? Окна удаляются автоматом вместе с родителем...

Можно на код посмотреть?

Спасибо.
Post Reply