secIcon:=TIcon.Create;
minIcon:=TIcon.Create;
chIcon:=TIcon.Create;
При работе программы постоянно растет память выделенная под неё.
Суть программы в том, что это таймер который "сидит" в 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:
...
Icon:=TIcon.Create; {создаем иконку}
...
При этом в теле процедуры Iсon не освобождается...
Далее.
procedure TForm1.Timer1Timer(Sender: TObject);
...
CreateTimerIcon(st2,secIcon);{создание иконки с секундами}
CreateTimerIcon(st1,minIcon);{создание иконки с минутами}
CreateTimerIcon(st3,chIcon);{создание иконки с часами}
...
В общем, программа в процедуре CreateTimerIcon теряет указатели на предыдущие экземпляры Icon. По крайней мере я так это понимаю :)
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 следующее:
Код:
у меня 4 минуты прошло - полет нормальный:). да кстати вроде лучше вместо Destroy использовать Free. советую еще пару раз прочесать свой код в поисках подобных вещей: может еще что-нибудь интересное найдешь.
Воистину, ибо... цитирую :)
Цитата:
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.
Позвольте подытожу :)
То что мы наблюдали называется утечка памяти :), тоесть память постоянно выделяется, но никогда не освобождается.
Всем спасибо. Сейчас попробую.
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;