Страница 1 из 1
Грязные окна
Добавлено: 14 Июнь 2006, 15:45
Игорь Столяров
Привет всем !
А не обращал ли кто внимание на такой интересный эффект:
Есть AppFrame - меню, в нем по таймеру (или вручную - все равно),
абсолютно штатными средствами открывается и закрывается
MDI (или SDI) окно как поток: Start(MyWindow). Так вот - если посмотреть в диспечере задач - то такое "приложение" будет медленно, но уверенно "подъедать" память с каждым циклом открытия/закрытия окна.
Если окошко открывается / закрывается по таймеру, например раз в 30 сек. - то за сутки будет съедено несколько Mbyte.
Это у меня какие-то проблемы с чисткой памяти или вообще так и должно быть ? И можно ли как-нибудь это безобразие прекратить ?
Среда WinXP SP2 & C63 9053. Заранее спасибо за совет ...
Re: Грязные окна
Добавлено: 16 Июнь 2006, 11:08
Andrew™
Игорь Столяров писал(а):
Это у меня какие-то проблемы с чисткой памяти или вообще так и должно быть ? И можно ли как-нибудь это безобразие прекратить ?
Среда WinXP SP2 & C63 9053. Заранее спасибо за совет ...
состряпал пример, и не увидел того, что память постоянно отжирается, вероятно, если это ABC, проблема в ABC классах
Код: Выделить всё
program
map
main
wProc
end
ThreadWPRoc LONG
code
main
main procedure
AppFrame APPLICATION('Application'),AT(,,493,293),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,ICON(icon:exclamation), |
SYSTEM,MAX,RESIZE,TIMER(30)
END
CODE
OPEN(AppFrame)
ACCEPT
CASE EVENT()
OF EVENT:Timer
IF NOT ThreadwPRoc
START(wProc,25000)
END
END
END
wProc PROCEDURE
Window WINDOW('Caption'),AT(,,287,162),FONT('MS Sans Serif',8,,FONT:regular),CENTER,IMM,TIMER(30),SYSTEM, |
GRAY,MDI
END
code
ThreadWPRoc = THREAD()
open(window)
ACCEPT
CASE EVENT()
OF EVENT:Timer
BREAK
END
END
close(window)
ThreadWPRoc = 0
Добавлено: 16 Июнь 2006, 11:16
ru_alex
В Clarion5.5 замечал подобное, при продолжительной работе проги (насколько это было возможно в 5.5

), память постепенно жралась, думал это из-за глючности менеждера памяти, теперь возможно дело действительно в ABC.
Добавлено: 16 Июнь 2006, 13:30
Игорь Столяров
Да действительно - я это заметил на программе с ABC. Причем, есть еще одна интересность - если окно в потоке не открывать, то нарастание памяти не происходит. При этом классы ABC используются - для доступа к файлам и т.д.
Тогда вопрос можно поставить по другому: есть ли средства и возможность вернуть память выделенную потоку с ABC, после его закрытия ?
Добавлено: 16 Июнь 2006, 13:35
Andrew™
Игорь Столяров писал(а):Да действительно - я это заметил на программе с ABC. Причем, есть еще одна интересность - если окно в потоке не открывать, то нарастание памяти не происходит. При этом классы ABC используются - для доступа к файлам и т.д.
Тогда вопрос можно поставить по другому: есть ли средства и возможность вернуть память выделенную потоку с ABC, после его закрытия ?
надо шерстить ABC классы, где то, что то не подчищают за собой, особенно работу ANY полей в GROUP и QUEUE, если таковые имеются
просто снаружи что то сделать, например побегать с бубном, не получится
ЗЫ
хорошо, что я так и не преполз на ABC.
Вооще то и от Legay юзается только Window и Source процедуры, остальное своё - родное

Добавлено: 16 Июнь 2006, 15:01
NickTsigouro
А может это проблема "грязного" закрытия файлов?
Добавлено: 16 Июнь 2006, 16:31
Дед Пахом
легко проверить - поиграться с окном, где нет никаких файлов
Добавлено: 16 Июнь 2006, 23:58
Олег
Буквально сейчас случайно наткнулся на:
Обновление - KB319740
Обновление для Windows XP, которое исправляет ошибку утечки памяти в Graphics Device Interface (GDI) при создании/удалении дочернего окна. После установки этого обновления - потребуется перезагрузка компьютера.
_http://download.microsoft.com/download/6/6/9/6697a1d9-4734-4829-80b9-de3d74fb6049/WindowsXP-KB319740-v5-x86-RUS.exe
Может из-за этого?
Добавлено: 17 Июнь 2006, 8:59
Игорь Столяров
Спасибо - к сожалению, не помогло. Я тоже склоняюсь к мысли, что ответ зарыт где-то в глубинах класов ABC - но моих знаний явно недостаточно, что бы его откопать. Да и смысл ?
Видимо придется запомнить еще одну "особенность" Clarion и просто обойти ее. Например для задач переодического опроса - не открывать окна в потоке ...
Добавлено: 17 Июнь 2006, 18:40
Олег
Ну, почему-же - сразу "не открывать окна"!?
Просто используй для таких процедур обычный шаблон "Исходный текст", или как он там, в ABC, называется. Т.е., рисуй "ручное" окно а для его обработки используй стандартный ACCEPT-цикл с нужными событиями. А еще лучше - адаптируй шаблон "Window" из Legacy-набора к ABC-шаблонам. Главная идея - обработка окна ТОЛЬКО стандартными операторами языка БЕЗ использования ABC-классов.
Добавлено: 18 Июнь 2006, 8:11
Игорь Столяров
К своему великому сожалению, господа - должен признать - что та же самая процедура переписанная без ABC работает без потерь памяти.
Окна открываются и закрываются нормально. Спасибо всем ...

Добавлено: 04 Июль 2006, 16:16
NickTsigouro
А у меня на ABC-шном фрейме все равно течет:
Код: Выделить всё
LegSpalsh PROCEDURE ! Declare Procedure
Thr Long
Window WINDOW('Caption'),AT(,,145,67),FONT('MS Sans Serif',8,,FONT:regular),TIMER(50),SYSTEM,GRAY,RESIZE, |
MDI
STRING(@s20),AT(28,29),USE(Thr)
END
CODE
Thr = Thread()
Open(Window)
Accept
Case Event()
Of Event:Timer
Break
! или Post(Event:CloseWindow), без разницы
end
end