Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Очистка памяти Добавлено: 30.06.05 11:19  

Автор вопроса:  LamerOnLine | ICQ: 334781088 
Может тема была, не помню...
Проблема в следующем - есть приложение, с динамической подгрузкой форм и объектов. После закрытия некоторых форм память освобождается не полностью, хотя позже все устаканивается. Но при частой работе потери памяти достигают о-го-го...
Вопрос - как можно принудительно очистить выделенную память объекта?

Ответить

  Ответы Всего ответов: 47  

Номер ответа: 1
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #1 Добавлено: 30.06.05 13:42
Это конечно не решит проблему, но иногда немного памяти освободить удается.

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Set Me = Nothing
End Sub

Или так

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    ;Dim obj As Object
    For Each obj In Me
        On Error Resume Next
        Set obj = Nothing
    Next
    Set Me = Nothing
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 30.06.05 17:08
Не, тут все несколько сложнее. Есть объекты, содержащие формы со многими контролами. Создаются объекты через CreateObject. При установки их в Nothing освобождается намного меньше памяти чем они занимают. В памяти продолжают находится их библиотеки. Хотя через пару минут они оттуда уходят. Примечательно что самого объекта уже как бы не существует, ссылок на него нет, событие Terminate отработало.
Может тогда кто знает как загасить эти dll и ocx в памяти? FreeLibrary результата не дает, TerminateThread недопустим - поток один. Может как-нить через HeapFree...
Небось кто-нить сталкивался.

Ответить

Номер ответа: 3
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #3
Добавлено: 30.06.05 17:28
не знаю, может не в тему, но как происходит выход из приложения? не TerminateProcess случайно? если случайно нет, попробуй разослать всему, что шевелится WM_CLOSE

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 30.06.05 17:57
Думаю что тебе это поможет ;)

Public Sub SetWrkSize()                                 ' Запрещаем VB кэшировать срань разную! (только для w2k)
    If Not OS_Version.dwPlatformId = &H2 Or OS_Version.dwMajorVersion < &H5 Then Exit Sub
    Call SetProcessWorkingSetSize(GetCurrentProcess, &HFFFF, &HFFFF)
End Sub


Все без деклараций, ну да ты разберешься...

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 30.06.05 18:02
Всем пасибо. Проблема решалась элементарным способом - CoFreeUnusedLibraries :)))))

Ответить

Номер ответа: 6
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #6 Добавлено: 30.06.05 18:21
Любопытно. Добавил себе в "Избранное".

Ответить

Номер ответа: 7
Автор ответа:
 JenkA



ICQ: 721440 

Вопросов: 4
Ответов: 5
 Профиль | | #7 Добавлено: 06.07.05 09:00
закинь примерчик CoFreeUnusedLibraries если не сложно.
ekory@yahoo.com

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 06.07.05 10:55
Какой тут может быть примерчик? Декларируй и юзай. Результаты посмотреть можешь тем же Process Viewer'ом. Хотя совет sne тоже помог.

Ответить

Номер ответа: 9
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 06.07.05 10:58
Думаю, лучше всего использовать их вместе. SetProcessWorkingSetSize освобождает много физической памяти от всякого барахла, и свопит то что не щас не нужно. Помогает здорово, но, к сожалению, библиотеки все равно толкутся в памяти. CoFreeUnusedLibraries их исправно выгружает. Реально скорость работы приложения повысилась раза в полтора.

Ответить

Номер ответа: 10
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #10 Добавлено: 06.07.05 19:29
Реально скорость работы приложения повысилась раза в полтора

Очень интересно. За счёт чего? Как измерялась скорость?

Ответить

Номер ответа: 11
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #11 Добавлено: 07.07.05 10:49
Когда приложение использует уйму тяжеловесных окон + БД - тормоза уже налицо, бенчмарк тут не нужен :)
А скорость возросла именно из-за существенного увеличения объема свободной физической памяти.

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 07.07.05 11:20
>> Когда приложение использует уйму тяжеловесных окон
А потом эти окошки ей приходится загружать обратно в память чтобы повторно использовать (если часто, то должны быть тормоза).... вобщем страно это, типа двойной эффект... может на компе просто памяти не хватает :) ?

Ответить

Номер ответа: 13
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #13 Добавлено: 07.07.05 15:39


Это не программа стала быстрее работать, а винда стала меньше тормозить и больше времени выделять программе.
Нагромождение объектов, нерациональное использование системных ресурсов заставляют винду отрывать время от выполнения собственно кода и тратить его на расчистку завалов, создаваемых программой.

Прелести ООП :-\

ООП форева!!!

Ответить

Номер ответа: 14
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #14 Добавлено: 07.07.05 16:02
Орден Шелкового Умника в студию!!
:)

Ответить

Номер ответа: 15
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 07.07.05 16:18
Ну так взяли бы и добавили такую функцию в VB. Что им жалко что ли? :)

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам