Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

При работе программы постоянно растет память выделенная под неё.

9.0K
22 апреля 2007 года
mr_smit
64 / / 03.12.2006
При работе программы постоянно растет память выделенная под неё.
Суть программы в том, что это таймер который "сидит" в System Tray и отсчитывает время проведенное в интернете (это еще не окончательный вариант). Рост памяти я наблюдаю в Диспетчере задач. Причем, если поставить интервал таймера (всмысле компонента Timer1) равным 10 то при значении 00:27:38 (в system tray, по крайней мере у меня) появляется сообщение:

Project TimerProject.exe raised exception class EOutOfResources with message 'Out of system resources'. Process stopped. Use Step or Run to continue.

Т.е. что то типа нехватка системных ресурсов. Что это такое и как с этим бороться? Может у кого было что нибудь похожее.

Исходник прилагается.:confused:
19K
22 апреля 2007 года
Релорт
17 / / 14.09.2006
procedure CreateTimerIcon(symb:string; var Icon:TIcon);
...
Icon:=TIcon.Create; {создаем иконку}
...
При этом в теле процедуры Iсon не освобождается...
Далее.
procedure TForm1.Timer1Timer(Sender: TObject);
...
CreateTimerIcon(st2,secIcon);{создание иконки с секундами}
CreateTimerIcon(st1,minIcon);{создание иконки с минутами}
CreateTimerIcon(st3,chIcon);{создание иконки с часами}
...

В общем, программа в процедуре CreateTimerIcon теряет указатели на предыдущие экземпляры Icon. По крайней мере я так это понимаю :)
257
22 апреля 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=mr_smit]Рост памяти я наблюдаю в Диспетчере задач. Причем, если поставить интервал таймера (всмысле компонента Timer1) равным 10 то при значении 00:27:38 (в system tray, по крайней мере у меня) появляется сообщение:

Project TimerProject.exe raised exception class EOutOfResources with message 'Out of system resources'. Process stopped. Use Step or Run to continue.[/quote]
эх... пока писал опоздал, но я все же оставлю
да ничего удивительного в этом нет: я бы тоже завозмущался:)
засорил-то как. ты посмотри на процедурку свою CreateTimerIcon и на строку в ней Icon:=TIcon.Create;, а учитывая что вызывается твоя процедурка каждые 10 миллисекунд, то сколько раз будет Icon:=TIcon.Create при том, что Icon.Free ты не разу не вызываешь? правильно, где-то 27*60+38! тебе просто винда не позволит столько раз это проделать. так что убираем данную строку из процедуры и помещаем в FormCreate следующее:
 
Код:
secIcon:=TIcon.Create;
minIcon:=TIcon.Create;
chIcon:=TIcon.Create;

у меня 4 минуты прошло - полет нормальный:). да кстати вроде лучше вместо Destroy использовать Free. советую еще пару раз прочесать свой код в поисках подобных вещей: может еще что-нибудь интересное найдешь.
4.6K
23 апреля 2007 года
Tokolist
268 / / 22.03.2007
[QUOTE=kosfiz]да кстати вроде лучше вместо Destroy использовать Free[/QUOTE]

Воистину, ибо... цитирую :)

Цитата:
It is not recommended coding style to call Destroy directly. Call Free instead. Free checks to ensure that the object reference is not nil before calling Destroy.



Цитата:
Unlike Destroy, Free is successful even if the object is nil, so if the object was never initialized, Free won’t result in an error.



Позвольте подытожу :)
То что мы наблюдали называется утечка памяти :), тоесть память постоянно выделяется, но никогда не освобождается.

9.0K
23 апреля 2007 года
mr_smit
64 / / 03.12.2006
Всем спасибо. Сейчас попробую.
9.0K
23 апреля 2007 года
mr_smit
64 / / 03.12.2006
Супер, все работает!!!!!! Кстати если немного доработать код, то можно сделать часы для System tray с секундами, а системные часы можно убрать следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
var hn : HWnd;
begin
hn := FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);
if hn <> 0 then
ShowWindow(hn,SW_HIDE);//прощате часики
end;

procedure TForm1.Button2Click(Sender: TObject);
var hn : HWnd;
begin
hn := FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);
if hn <> 0 then
ShowWindow(hn,SW_SHOW);//привет
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог