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.

Отчего так?

Ответ на: комментарий от kemm

Я видел, оно остаётся на прежнем уровне.
Но если таких полей ввода 1000, то занимается овер 50 Mb памяти.
И вся эта петрушка страшно тормозит.

new_account
() автор топика
Ответ на: комментарий от new_account

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

mv ★★★★★
()
Ответ на: комментарий от new_account

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

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

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

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

kemm
()
Ответ на: комментарий от new_account

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

loruser
()
Ответ на: комментарий от kemm

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

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

Я не знал.

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

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

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

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

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

new_account
() автор топика
Ответ на: комментарий от new_account

А что ж там заплюшки у iwidgets, которых нет у wcb скажем и mentry?

placement_new ★★
()
Ответ на: комментарий от loruser

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

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

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

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

new_account
() автор топика

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

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

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

g
()
Ответ на: комментарий от g

>о чём же? расскажи глупому.

о корелляции между Tk и ресурсами

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

mannaz
()
Ответ на: комментарий от g

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

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

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

Waterlaz ★★★★★
()
Ответ на: комментарий от mannaz

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

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

jtootf ★★★★★
()
Ответ на: комментарий от Waterlaz

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

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

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