Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.09.2009, 16:42
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию Прога занимает много памяти

Написал прогу. Исходник показать не могу.
В ней таймер каждую милисекунду считывает данные из текстового файла, расчитывает эти данные и записывает в другой текст. файл.
Проблема в след: как и любая другая прога она сохраняет (что-то там)) в памяти. И через диспетчер задач видно как каждую сек. нарастает по 200 кб! Когда программу сворачиваешь - разворачиваешь - на вкладке процессы для этой программы память освобождается. Но на мою такой цирк не действует. Только после закрытия на вкладке быстродействие видно как высвобождается 200 мб)))

Вопрос: как освобождать занимаемую память, не перезапуская программу. Можно ли это сделать без применнеия всяких там dispose, allocmem..?
Ответить с цитированием
  #2  
Старый 05.09.2009, 16:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Когда программу сворачиваешь - разворачиваешь - на вкладке процессы для этой программы память освобождается
С какого перепуга, она должна освобождаться при сворачивании приложения? На освобождение памяти это никак влиять не должно. Где-то в проге вы явно за собой не подчистили. Найти такое место бывает очень непросто, особенно если используете рекурсии.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 05.09.2009, 17:39
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Да рекурсия есть. А что с ней?

В том то и дело что я ни где ни чего не подчисщал. Вот и спрашиваю как?

Последний раз редактировалось одинадцатый, 05.09.2009 в 18:15.
Ответить с цитированием
  #4  
Старый 05.09.2009, 17:59
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

вы хоть на пальцах объясните как все организованно
Ответить с цитированием
  #5  
Старый 05.09.2009, 18:29
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Цитата:
Сообщение от Страдалецъ
С какого перепуга, она должна освобождаться при сворачивании приложения? На освобождение памяти это никак влиять не должно.
А ты проверял прежде чем утверждать такое?

При сворачивании окна, windows действительно "забирает" у приложения всю лишнюю память. Самому это можно сделать так.
Код:
var MainHandle: THandle;
begin
  MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
   SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
   CloseHandle(MainHandle);

Ну и конечно, следи за создаваемыми объектами и дескрипторами, а то тебя это не спасет.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #6  
Старый 05.09.2009, 18:38
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Если свернуть программу то на вкладке процессы для этой программы память освобождается. И только после закрытия на вкладке быстродействие видно как высвобождается 200 мб. то есть не понятно: при сворачивании то ли она освобождется то ли обнуляется счетчик...

Я нашел в каком месте беда происходит - модуль 4500 строк. Выкладывать не буду - вряд ли кто то захочет взгялнуть.)

А что с рекурсией?
Ответить с цитированием
  #7  
Старый 05.09.2009, 18:47
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Все таки выложу...

через эти строки происходит обращение к модулю:

Код:
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;
Вложения
Тип файла: rar WbemScripting_TLB.rar (16.1 Кбайт, 4 просмотров)
Ответить с цитированием
  #8  
Старый 05.09.2009, 21:46
одинадцатый одинадцатый вне форума
Новичок
 
Регистрация: 16.04.2009
Сообщения: 95
Репутация: 10
По умолчанию

Я смотрю у всех алергия на объемные исходники)))

Подскажите хотя бы как вообще такие проблемы решаются.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:56.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter