LINUX.ORG.RU

Tk, использование памяти


0

0

Господа программисты, подскажите пожалуйста, почему Tk не освобождает память после уничтожения виджетов?

Вот, например, такой код.

package require Tk
package require Iwidgets

# Main form
ttk::button .launch -text "Launch" -command {createFrm}
ttk::button .exit   -text "Exit"   -command {destroy .}
pack .launch .exit

proc createFrm {} {
    # Create new toplevel and fill it with grided entryfields
    toplevel .frm
    set ::i 0
    while {$::i <= 50} {
        # Widgets
        ::iwidgets::entryfield .frm.enFirst$::i
        ::iwidgets::entryfield .frm.enSecond$::i
        # Geometry
        grid .frm.enFirst$::i  .frm.enSecond$::i -padx 5 -row $::i
        incr ::i
    }
    
    ttk::button .frm.wipe  -text "Wipe"  -command {wipeFrm}
    ttk::button .frm.close -text "Close" -command {destroy .frm}
    grid .frm.wipe .frm.close
}

proc wipeFrm {} {
    # Wipe all entry widgets
    while {$::i >= 0} {
        destroy .frm.enFirst$::i
        destroy .frm.enSecond$::i
        incr ::i -1
    } 
}

При запуске потребление памяти ~8 Mb, после создания .frm ~14 Mb.

И занятая память не освобождается ни после последовательного уничтожения виджетов, ни после простого уничтожения формы .frm.

Отчего так?

Re: Tk, использование памяти

Создай ещё раз форму и посмотри на использование памяти...

kemm ()
Ответ на: Re: Tk, использование памяти от new_account

Re: Tk, использование памяти

Я Tk не знаю, но, судя по всему, у тебя референсы на формы остаются.

mv ★★★★★ ()
Ответ на: Re: Tk, использование памяти от new_account

Re: Tk, использование памяти

> Я видел, оно остаётся на прежнем уровне.

Логично. Никто не обещал, что GC после сборки мусора будет (сразу) отдавать память системе (и что та её будет тут же брать -- тоже никто не обещал, в общем-то)

> Но если таких полей ввода 1000, то занимается овер 50 Mb памяти.

Одновременно 1000 полей ввода -- это что-то не то в консерватории. Или я чего-то недопонял?

kemm ()
Ответ на: Re: Tk, использование памяти от kemm

Re: Tk, использование памяти

>>референсы на формы остаются.
Вот и мне так кажется.

>>Никто не обещал , что GC после сборки мусора будет (сразу) отдавать память системе

Я не знал.

>>это что-то не то в консерватории.

Это не очень красивый пример.
Можно заменить на 20 полей и 10 кнопок, суть не меняется - занятая память не освобождается даже тогда, когда будто бы объекты уничтожены явно, а не только топлевел, на котором они расположены.
Пишут, что:
>>Tk manage memory eagerly, releasing it as soon as the reference to it vanishes

Этого не видно, похоже, что действительно остаются референсы.

>>Если заменить на entry, то потребление памяти в норме.

И придётся отказаться от плюшек :^)

new_account ()
Ответ на: Re: Tk, использование памяти от loruser

Re: Tk, использование памяти

>>Ещё раз: виноваты _именно_ Iwidgets.
Не надо так нервничать, я всё понял. Спасибо, вопрос снят.

>>А что ж там заплюшки у iwidgets

Про mentry и wcb первый раз слышу.
Их нет в репах.
У меня нет желания разбираться с их опциями.
Пролистал документацию, и не понял, чем оно лучше entryfield.
Для entryfield есть нужная мне опция labelImage.

А вообще спасибо, обязательно посмотрю более подробно.

new_account ()

Re: Tk, использование памяти

а можете раскрыть секрет:

если вас так заботят ресурсы, зачем писать на тыке?

или я что-то пропустил?

g ()
Ответ на: Re: Tk, использование памяти от jtootf

Re: Tk, использование памяти

Похоже, что здесь пора вешать плашку, как в Talks, с чем-то вроде:
"Уважаемые участники Development, помните, что нахождение вблизи мощных источников пафоса может способствовать развитию лучевой болезни у окружающих"

mannaz ()
Ответ на: Re: Tk, использование памяти от g

Re: Tk, использование памяти

>если вас так заботят ресурсы, зачем писать на тыке?

Вопрос был несколько о другом.

ЗЫ кстати я вот пробовал разные хеллоу ворлды на бинбингах tk к Хаскелю и очень даже экономно в плане ресурсов выходит... А вот tcl - да, много жрет ИМХО

Waterlaz ★★★★★ ()
Ответ на: Re: Tk, использование памяти от mannaz

Re: Tk, использование памяти

>"Уважаемые участники Development, помните, что нахождение вблизи мощных источников пафоса может способствовать развитию лучевой болезни у окружающих"

самокритика это хорошо, самокритику мы любим :)

jtootf ★★★★★ ()
Ответ на: Re: Tk, использование памяти от Waterlaz

Re: Tk, использование памяти

>ХЗ... брал примеры из туториала.

с shootout его убрали, увы. раньше там были кошерные примеры того, как из Tcl можно выжать эффективность

jtootf ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.