|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Прога занимает много памяти
Написал прогу. Исходник показать не могу.
В ней таймер каждую милисекунду считывает данные из текстового файла, расчитывает эти данные и записывает в другой текст. файл. Проблема в след: как и любая другая прога она сохраняет (что-то там)) в памяти. И через диспетчер задач видно как каждую сек. нарастает по 200 кб! Когда программу сворачиваешь - разворачиваешь - на вкладке процессы для этой программы память освобождается. Но на мою такой цирк не действует. Только после закрытия на вкладке быстродействие видно как высвобождается 200 мб))) Вопрос: как освобождать занимаемую память, не перезапуская программу. Можно ли это сделать без применнеия всяких там dispose, allocmem..? |
#2
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Да рекурсия есть. А что с ней?
В том то и дело что я ни где ни чего не подчисщал. Вот и спрашиваю как? Последний раз редактировалось одинадцатый, 05.09.2009 в 18:15. |
#4
|
||||
|
||||
вы хоть на пальцах объясните как все организованно
|
#5
|
||||
|
||||
Цитата:
При сворачивании окна, windows действительно "забирает" у приложения всю лишнюю память. Самому это можно сделать так. Код:
var MainHandle: THandle; begin MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID); SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1)); CloseHandle(MainHandle); Ну и конечно, следи за создаваемыми объектами и дескрипторами, а то тебя это не спасет. ...сказал, и загрустил от бесспорной своей правоты |
#6
|
|||
|
|||
Если свернуть программу то на вкладке процессы для этой программы память освобождается. И только после закрытия на вкладке быстродействие видно как высвобождается 200 мб. то есть не понятно: при сворачивании то ли она освобождется то ли обнуляется счетчик...
Я нашел в каком месте беда происходит - модуль 4500 строк. Выкладывать не буду - вряд ли кто то захочет взгялнуть.) А что с рекурсией? |
#7
|
|||
|
|||
Все таки выложу...
через эти строки происходит обращение к модулю: Код:
function MagWmiGetPropStr (wmiProp: ISWbemProperty): string ; var I: integer ; begin result := ''; if VarIsNull(wmiProp.Get_Value) then result := 'NULL' else begin case wmiProp.CIMType of wbemCimtypeSint8, wbemCimtypeUint8, wbemCimtypeSint16, wbemCimtypeUint16, wbemCimtypeSint32, wbemCimtypeUint32, wbemCimtypeSint64: if VarIsArray(wmiProp.Get_Value) then begin for I := 0 to VarArrayHighBound (wmiProp.Get_Value, 1) do begin if I > 0 then result := result + '|' ; result := result + IntToStr (wmiProp.Get_Value [i]) ; end ; end else result := IntToStr (wmiProp.Get_Value); wbemCimtypeReal32, wbemCimtypeReal64: result := FloatToStr (wmiProp.Get_Value); wbemCimtypeBoolean: if wmiProp.Get_Value then result := 'True' else result := 'False'; wbemCimtypeString, wbemCimtypeUint64: if VarIsArray(wmiProp.Get_Value) then begin for I := 0 to VarArrayHighBound (wmiProp.Get_Value, 1) do begin if I > 0 then result := result + '|' ; result := result + wmiProp.Get_Value [i] ; end ; end else result := wmiProp.Get_Value; wbemCimtypeDatetime: result := wmiProp.Get_Value; wbemCimtypeReference: begin result := wmiProp.Get_Value ; // Services.Get(result, 0, nil).GetObjectText_(0)); another query end; wbemCimtypeChar16: result := '<16-bit character>'; wbemCimtypeObject: result := '<CIM Object>'; end ; end; end ; function MagWmiGetInfoEx (const Comp, NameSpace, User, Pass, Arg: string ; var WmiResults: T2DimStrArray; var instances: integer; var errinfo: string): integer ; var wmiLocator: TSWbemLocator; wmiServices: ISWbemServices; wmiObjectSet: ISWbemObjectSet; wmiObject: ISWbemObject; propSet: ISWbemPropertySet; wmiProp: ISWbemProperty; propEnum, Enum: IEnumVariant; ovVar1, ovVar2: OleVariant; // 5.2 lwValue: LongWord; sValue: String; inst, row: integer ; dimmed: boolean ; begin result := 0 ; errinfo := '' ; Instances := 0 ; SetLength (WmiResults, 0, 0) ; dimmed := false ; VarClear (ovVar1) ; // 5.2 VarClear (ovVar2) ; // 5.2 wmiLocator := TSWbemLocator.Create (Nil) ; try try wmiServices := wmiLocator.ConnectServer (Comp, Namespace, User, Pass, '', '', 0, nil) ; if Pos ('SELECT', Arg) = 1 then wmiObjectSet := wmiServices.ExecQuery (Arg, 'WQL', wbemFlagReturnImmediately, nil) else wmiObjectSet := wmiServices.InstancesOf (Arg, wbemFlagReturnImmediately or wbemQueryFlagShallow, nil) ; Instances := wmiObjectSet.Count ; if Instances = 0 then exit ; // Replicate VBScript's "for each" construct Enum := (wmiObjectSet._NewEnum) as IEnumVariant; inst := 0 ; while (Enum.Next (1, ovVar1, lwValue) = S_OK) do // 5.2 begin wmiObject := IUnknown(ovVar1) as SWBemObject; // 5.2 propSet := wmiObject.Properties_; result := propSet.Count ; if NOT dimmed then begin SetLength (WmiResults, Instances + 1, result + 1) ; WmiResults [0, 0] := 'Instance' ; dimmed := true ; end ; propEnum := (propSet._NewEnum) as IEnumVariant; inc (inst) ; row := 1 ; WmiResults [inst, 0] := IntToStr (inst) ; // Replicate VBScript's "for each" construct while (propEnum.Next (1, ovVar2, lwValue) = S_OK) do // 5.2 begin wmiProp := IUnknown(ovVar2) as SWBemProperty; // 5.2 sValue := MagWmiGetPropStr (wmiProp) ; if inst = 1 then WmiResults [0, row] := wmiProp.Name ; WmiResults [inst, row] := sValue ; inc (row) ; VarClear (ovVar2); // 5.2 whomp them mem leaks end; end; VarClear (ovVar1); // 5.2 whomp them mem leaks except VarClear (ovVar1) ; // 5.2 VarClear (ovVar2) ; // 5.2 result := -1 ; // errinfo := GetExceptMess (ExceptObject) ; // 5.2 end ; finally wmiLocator.Free; end; end; |
#8
|
|||
|
|||
Я смотрю у всех алергия на объемные исходники)))
Подскажите хотя бы как вообще такие проблемы решаются. |