Вверх ↑
Этот топик читают: Гость
Ответов: 355
Рейтинг: 2
#1: 2013-05-06 22:12:42 ЛС | профиль | цитата
Доброго времени суток.
В моём приложении происходит вывод запущенных процессов в MT-таблицу со значками файлов этих процессов. При каждом обновлении списка количество RAM, занимаемое приложением увеличивается примерно на мегабайт. Автообновление списка происходит каждые 5 секунд (к примеру). Когда приложение начинает использовать более 80 мегабайт RAM, обновление списка останавливается, начинаются глюки и вообще, приложение начинает работать некорректно.
Как можно избежать постоянного увеличения используемой памяти для моего приложения?
карма: 1

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#2: 2013-05-06 22:28:26 ЛС | профиль | цитата
nickware писал(а):
Как можно избежать постоянного увеличения используемой памяти для моего приложения?

Без наличия куска схемы, которая вызывает утечку памяти невозможно вообще никак ответить на поставленный вопрос
карма: 22

0
Ответов: 355
Рейтинг: 2
#3: 2013-05-07 00:42:50 ЛС | профиль | цитата
nesco, пожалуйста. Дождитесь, когда процесс будет использовать около 80 Мб RAM.
code_30953.txt

P. S.: у меня используется VBScript для получения списка процессов, но со штатными компонентами HiAsm тоже самое.
карма: 1

0
файлы: 1code_30953.txt [6.3KB] [141]
Разработчик
Ответов: 26324
Рейтинг: 2148
#4: 2013-05-07 01:09:06 ЛС | профиль | цитата
nickware писал(а):
у меня используется VBScript для получения списка процессов

Проблема именно в этом модуле

Add(MainForm,8714316,259,161)
{
Width=668
Height=431
Position=1
link(onCreate,14387762:doTimer,[])
}
Add(Timer,14387762,336,175)
{
link(onTimer,11484304:doWork,[])
}
Add(StyleXP,1691086,259,126)
{
}
Add(VBJScript,11484304,406,175)
{
WorkPoints=#6:doWork|
EventPoints=#7:onEvent|
Script=#68:'*******************************************************************|18:' Имя: ProcessInfo|16:' Язык: VBScript|47:' Описание: Вывод свойств запущенных процессов |68:'*******************************************************************|15:Option Explicit|0:|22:Sub doWork(Data,Index)|22:' Объявляем переменные|38:Dim strComputer ' Имя компьютера|45:Dim strNamespace ' Имя пространства имен|48:Dim objService ' Объект SWbemServices |56:Dim colProcesses ' Коллекция экземпляров класса WMI|41:Dim objProcess ' Элемент коллекции|45:Dim strResult ' Результирующая строка|39:Dim WshShell ' Объект WshShell|44:Dim theNotepad ' Объект WshScriptExec|52:Dim tab ' Разделитель свойств в строке|0:|21:' Объявляем константы|30:Const wbemFlagForwardOnly = 32|36:Const wbemFlagReturnImmediately = 16|0:|43:' Присваиваем начальные значения переменным|17:strComputer = "."|27:strNamespace = "Root\CIMV2"|14:strResult = ""|9:tab = ";"|0:|38:' Подключаемся к пространству имен WMI|76:Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)|0:|117:Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process",,wbemFlagReturnImmediately+wbemFlagForwardOnly)|35:For Each objProcess In colProcesses|47: strResult = strResult & objProcess.Name & tab|57: strResult = strResult & objProcess.ExecutablePath & tab|70: strResult = strResult & ConvDateTime(objProcess.CreationDate) & tab|54: strResult = strResult & objProcess.Priority & VbCrLf|23: Sys.onEvent strResult|4:Next|7:End Sub|0:|34:Function ConvDateTime(strDateTime)|11:Dim strTemp|32:strTemp = Mid(strDateTime, 1, 4)|23:strTemp = strTemp & "/"|42:strTemp = strTemp & Mid(strDateTime, 5, 2)|23:strTemp = strTemp & "/"|42:strTemp = strTemp & Mid(strDateTime, 7, 2)|23:strTemp = strTemp & " "|42:strTemp = strTemp & Mid(strDateTime, 9, 2)|23:strTemp = strTemp & ":"|43:strTemp = strTemp & Mid(strDateTime, 11, 2)|23:strTemp = strTemp & ":"|43:strTemp = strTemp & Mid(strDateTime, 13, 2)|23:If IsDate(strTemp) Then|39: ConvDateTime = FormatDateTime(strTemp)|4:Else|18: ConvDateTime = ""|6:End If|12:End Function|
UseName=0
}


Запусти ПО и диспетчер задач, посмотри, как оперативно пожирается память твоим приложением
------------ Дoбавленo в 01.09:
Штатный пример на ProcessInfo, построенный также на технологии WMI, не пожирает память при подключении таймера
карма: 22

0
Ответов: 355
Рейтинг: 2
#5: 2013-05-07 01:18:34 ЛС | профиль | цитата
Запусти ПО и диспетчер задач, посмотри, как оперативно пожирается память твоим приложением

Об этом я и говорил.

Да, и действительно. Сейчас произведу дополнительные тесты и отпишусь о результате.
------------ Дoбавленo в 01.18:
Похоже, что проблема решена. Благодарю.
карма: 1

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#6: 2013-05-07 01:20:15 ЛС | профиль | цитата
nickware писал(а):
Похоже, что проблема решена. Благодарю.

В чем была проблема Нехорошо такие вещи скрывать
карма: 22

0
Ответов: 355
Рейтинг: 2
#7: 2013-05-07 01:31:37 ЛС | профиль | цитата
nesco, как раз в этом модуле. Странно, но я проверял и ProcessInfo, и там было то же самое. Правда, с тех пор схема была существенно оптимизирована. Сейчас потребление памяти стабильное, в пределах нормы, приложение работает без сбоев.
карма: 1

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#8: 2013-05-07 01:53:10 ЛС | профиль | цитата
Ну так ты не озвучил решение проблемы. Ты стал использовать штатный ProcessInfo, правильно я понял
карма: 22

0
Ответов: 355
Рейтинг: 2
#9: 2013-05-07 02:36:27 ЛС | профиль | цитата
nesco, да, именно так.
------------ Дoбавленo в 02.36:
Ан нет. Проблема решена не полностью. Потребление памяти в норме, а вот прекращение работоспособности приложения через 10-15 минут осталось. Запустите схему с ProcessInfo и таймером и подождите минут 10. У меня список перестал обновляться, а при попытке вручную обновить его (запросить список процессов), вылезает ошибка.
карма: 1

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#10: 2013-05-07 03:06:28 ЛС | профиль | цитата
А Х его З почему так. Ситему спрашивать надо. А почему нельзя использовать EnumProcess
карма: 22

0
Ответов: 355
Рейтинг: 2
#11: 2013-05-07 03:11:01 ЛС | профиль | цитата
nesco, можно. Но с ним такая же лажа. Его и использовал с самого начала, и из-за этой фигни пришлось экспериментировать.
карма: 1

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#12: 2013-05-07 03:24:47 ЛС | профиль | цитата
Проверил, 20 мин работало и никаких проблем.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#13: 2013-05-07 03:31:19 ЛС | профиль | цитата
[flood]Запускай, и ложись спать, проснешься - скажешь про проблемы [/flood]
карма: 9

0
Разработчик
Ответов: 26324
Рейтинг: 2148
#14: 2013-05-07 16:51:51 ЛС | профиль | цитата
Galkov писал(а):
Запускай, и ложись спать, проснешься - скажешь про проблемы

Не, нафиг, я комп выключаю. Лучше на работе попробую, там и комп послабее
------------ Дoбавленo в 16.51:
Прогнал на работе штатный пример с таймером в течении пяти часов, ни разу не повис
карма: 22

0
Ответов: 355
Рейтинг: 2
#15: 2013-05-07 19:28:42 ЛС | профиль | цитата
nesco, именно с таблицей и с иконками процессов?
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)