• Поиск по форумам
  •  
      Этот форум закрыт. Новый форум располагается по адресу http://forum.use.ru  

      Nordnet Форум
      Программирование
      Освобождение памяти
     
    Страницы: 1
    Автор Тема:  Освобождение памяти
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 16-08-2006 19:13    
    Вопрос такой. Пишу прогу, которая всегда должна висеть в трейе. Проблема заключается, в том что при обращении к проге, увеличивается кол-во занимаемой памяти этой прогой. Я решил эту проблему так:
    ShowWindow(frmMain, SW_MINIMIZE);
    ShowWindow(frmMain, SW_HIDE);
    Но мне кажется, что это не очень правильно.
    Может что-то посоветуете?
    (пишу на Delphi, без использования визуальных компонентов)


     
    Сообщение было изменено автором 16-08-2006 в 19:14
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 16-08-2006 19:37    
    1. трее
    2. вне зависимости от того, как ты скрываешь прогу, количество памяти, занимаемой этой прогой не изменится.
     
    Сообщение было изменено автором 16-08-2006 в 19:37
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 16-08-2006 20:58    
    2 Force:
    (2) Отнюдь. Любая прога при сворачивании в трей, согласно диспетчеру задач, освобождает память. Это видно по столбцам "Память" и "Пиковое использование памяти".

    Степан Капуста 

    регистрация: 14-11-2001 в 09:37
    сообщений: 16766

    отправлено 16-08-2006 21:34    

    16-08-2006 20:58 сообщение от Sergion:
    «(2) Отнюдь. Любая прога при сворачивании в трей, согласно диспетчеру задач, освобождает память. Это видно по столбцам "Память" и "Пиковое использование памяти".»


    Вот и именно, что согласно диспетчеру задач... :-) А согласно здравой логике и практическим исследованиям - нет.
    Шпион 

    регистрация: 04-04-2005 в 23:30
    сообщений: 1928

    отправлено 16-08-2006 21:36    
    2 Форс: количество выделяемой памяти изменяется... Проверял опытным путем..

    2 Сержион:
    Точно не могу сказать, но можешь попробовать изменить приоритет процесса:

    SetpriorityClass(getcurrentprocess(),низкий_приоритет);

    Тогда твоей проге будет отводиться мало памяти...

    Пиши, используя ф-и API напрямую..:)
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 16-08-2006 21:52    
    2 Sergion:
    Ну, начнем с того, что диспетчер задач показывает немного не ту память, которую использует приложение. А показывает он Working Set, который имеет не очень прямое отношение к используемой памяти.
    Ну а далее - пустое окно, в любом виде будет жрать столько, сколько ему надо, с учетом используемых библиотек.

    ЗЫ: Пошел создавать форму.
    Степан Капуста 

    регистрация: 14-11-2001 в 09:37
    сообщений: 16766

    отправлено 16-08-2006 21:57    

    16-08-2006 21:36 сообщение от Шпион:
    «2 Сержион:
    Точно не могу сказать, но можешь попробовать изменить приоритет процесса:

    SetpriorityClass(getcurrentprocess(),низкий_приоритет);

    Тогда твоей проге будет отводиться мало памяти...»


    Глупость полную сказал. Приоритет влияет только на на то, сколько тиков дадут твоему процессу. Если он запросит гиг памяти, чтобы файл с диска откэшить, ему при любом приоритете выделят гиг.
    Степан Капуста 

    регистрация: 14-11-2001 в 09:37
    сообщений: 16766

    отправлено 16-08-2006 21:58    

    16-08-2006 19:13 сообщение от Sergion:
    «Я решил эту проблему так:
    ShowWindow(frmMain, SW_MINIMIZE);
    ShowWindow(frmMain, SW_HIDE);»


    А вот с такими делами можешь та-а-акие косяки поиметь... :-)
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 16-08-2006 22:23    
    Создал, проверил. С памятью все в порядке, а вот Working Set - действительно гуляет, винда заботится о пользователях ;)

    ЗЫ: Если уж так хоцца - заведи в цикле что-нить типа
    SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
    Шпион 

    регистрация: 04-04-2005 в 23:30
    сообщений: 1928

    отправлено 16-08-2006 22:42    

    16-08-2006 21:57 сообщение от Степан Капуста:
    «

    16-08-2006 21:36 сообщение от Шпион:
    «2 Сержион:
    Точно не могу сказать, но можешь попробовать изменить приоритет процесса:

    SetpriorityClass(getcurrentprocess(),низкий_приоритет);

    Тогда твоей проге будет отводиться мало памяти...»


    Глупость полную сказал. Приоритет влияет только на на то, сколько тиков дадут твоему процессу. Если он запросит гиг памяти, чтобы файл с диска откэшить, ему при любом приоритете выделят гиг.»






    Точно не могу сказать....



    Я предположил просто...

    А если в свернутом режиме? Имхо, меньше памяти и ЦП будет тратится... Если не так, то просвяти....
     
    Сообщение было изменено автором 16-08-2006 в 22:45
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 17-08-2006 10:39    
    2 Шпион:
    Ты считаешь популяцию кроликов в Австралии, каждый кролик занимает 1Кб памяти.
    А вот теперь скажи, как зависит популяция кроликов в Австралии и является ли твое приложение свернутым? Могу сказать - никак.

    Другое дело, если ты руками специально проверяешь в каком виде у тебя приложение и убиваешь кроликов, тогда память будет распределяться по-другому, но опять же - это уже твои изыскания, и тоже самое можно сделать при других условиях.
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 17-08-2006 12:14    

    16-08-2006 21:58 сообщение от Степан Капуста:
    «

    16-08-2006 19:13 сообщение от Sergion:
    «Я решил эту проблему так:
    ShowWindow(frmMain, SW_MINIMIZE);
    ShowWindow(frmMain, SW_HIDE);»


    А вот с такими делами можешь та-а-акие косяки поиметь... :-)»


    Какие? Может просветишь?
    Sergion 

    регистрация: 11-11-2004 в 15:33
    сообщений: 55

    отправлено 17-08-2006 12:29    
    2 All:
    Это конечно все хорошо, но исходя из этого, Диспетчер задач показывает неверный размер памяти, занимаемой прогой. Тогда и свободную память он показывает неверно?
    Вообщем при помощи TaskInfo выяснил, что прога занимает ~30Мб виртуального адресного пространства и этот параметр практически не изменяется.

    2 Force:
    Попробовал SetProcessWorkingSetSize. Действие такое же, как и при помощи ShowWindow(frmMain, SW_MINIMIZE); ShowWindow(frmMain, SW_HIDE);
    Т.е. меняется минимальный Working Set. Забавно.
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 17-08-2006 12:37    
    2 Sergion:
    По поводу памяти - если ее будет не хватать, то винда отберет у твоего приложения лишнее, так что по идее переживать не надо по этому поводу (хотя маленькие числа выглядят красиво ;) ).

    Ну а воркинг сет по идее стоит использовать или для такого баловства, или если очень хорошо знаешь свое приложение (но это надо быть специалистом, чтобы точно подобрать парамтеры).
    Степан Капуста 

    регистрация: 14-11-2001 в 09:37
    сообщений: 16766

    отправлено 23-08-2006 21:36    

    16-08-2006 22:42 сообщение от Шпион:
    «А если в свернутом режиме? Имхо, меньше памяти и ЦП будет тратится... Если не так, то просвяти....»


    А чем меньше-то будет??? Программный код сархивируется? Обрабатываемые данные меньше станут? Буфер отрисовки окна меньше станет?
    Степан Капуста 

    регистрация: 14-11-2001 в 09:37
    сообщений: 16766

    отправлено 23-08-2006 21:37    

    17-08-2006 12:14 сообщение от Sergion:
    «Какие? Может просветишь?»


    На Win9x при выходе из Винды твоя программа может не выйти, в результате чего Винда виснет. Там еще надо кое-чего обрабатывать из событий ручками...
    Страницы: 1