** Harold |
Отправлено: 01.03.2005, 15:18 |
|
Не зарегистрирован
|
Почему-то растет количество дескрипторов (по TaskManager'у) в процессе выполнения проги. Исключаем этот код — все гуд — кол-во дескрипторов не увеличиваемся.
[CODE]
void __fastcall TForm1::TimerSaveLogsTimer(TObject *Sender)
{
MemoLogFile->Lines->SaveToFile(sCurrentLogFolder+ "\\" + "\\" +"Data.log");
}
[CODE]
Не хорошо получается, если раз в секунду писать часов 8....
Как правильно сделать? Подскажите, плз... |
|
Gedeon |
Отправлено: 01.03.2005, 15:57 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну, во первых зачем это?
sCurrentLogFolder+ "\\" + "\\" +"Data.log"
я бы это все заменил на
CODE |
sCurrentLogFolder + "\\Data.log" |
Только что попробовал Пуск-Выполнить: c:\\\\\\\\\temp — выполняется, короче по барабану сколько бэк слешей (ну это так к слову).
А вообще крайне неправильный метод как хранения информации (в визуальном обьекте), так и ее запись.
Зачем хранить всю инфу в ОЗУ? Появилась инфа для лога, кинули в файл, и все, конечно кол-во памяти будет расти при добавлении данных и их накоплении.
Поищите по форуму как осуществлять запись в файл построчно.
Отредактировано Gedeon — 01/03/2005, 14:00
|
|
Guest |
Отправлено: 01.03.2005, 16:35 |
|
Не зарегистрирован
|
Спасибо за совет. Буду добавлять построчно. (Я правильно понимаю, что файл открыл, строку добавил, файл закрыл. Или держать открытым? А если все рухнет? или вероятность испортить открытый текстовый файл таким образом мала?)
Визуально удобно — видно, что происходит в данный момент. А можно и "отмотать" назад. (Memo, ествн, Enabled = false )
А какая разница "видимый" массив (Memo) или "невидимый" где-то в памяти...?
Ну и пусть займет хоть 10 лишних мегов ОЗУ, сейчас же память не проблема, если без утечек. (Память растет — понятно, а дескрипторы-то почему растут?)
"\\" +" \\" — сам не понял, наверное, между группами слешей когда-то было что-то еще.... |
|
Gedeon |
Отправлено: 01.03.2005, 17:10 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Если рухнет приложение с открытым файлом, файл не испортится, закрывать или держать открытым ИМХО зависит от того насколько часто идет запись, у меня для этих целей есть функция скормил имя файла и строку, а она открыла, записала, закрыла, и не парюсь.
От видимости контрола обьем памяти не зависит, но вместо невидимого мемо лучше использовать TStringList. Что касается визуально удобно, то по моему открыть этот файл в фаре например и смотреть там не менее удобно + все возможности поиска, печати и т.д. Но если иногда надо то ничего не мешает отобразить мемо и помимо файла пресовать строки в него.
А что это вообще за дескрипторы? Не реестра ли? Что авторы имели ввиду ведь дескрипторов м.б. немеряно окон, фалов, ключей реестра еще черти чего. У себя посмотрел 7270 вроде как для всего перечисленного дохеровато . И почему Вас смущает их увеличение, если закрыть прогу, к-рая их наплодила, они уменьшаются?
|
|
** Harold |
Отправлено: 01.03.2005, 17:41 |
|
Не зарегистрирован
|
|
|
** Harold |
Отправлено: 01.03.2005, 17:45 |
|
Не зарегистрирован
|
Да, пропадают. Если исключить запись в лог — дескрипторы эти вообще на растут... Просто пугает их количество через часов 8 ... типа, 24869 штук. Прога не падает, работает... Сколько их вообще допустимо (max)? |
|
Gedeon |
Отправлено: 01.03.2005, 17:59 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Так а что это вообще такое? Эти дескрипторы, дескрипторы чего?
|
|
** Harold |
Отправлено: 01.03.2005, 18:45 |
|
Не зарегистрирован
|
Не знаю. Windows не говорит. Наверное, при открытии файла создеется новый дескриптор? Не знаю...
Словарь: LingvoComputer (En-Ru)
descriptor
1) дескриптор; описатель; описание
2) паспорт; идентификатор
3) признак (в ассоциативном ЗУ)
|
|
** Harold |
Отправлено: 01.03.2005, 18:50 |
|
Не зарегистрирован
|
Screen Shot на 2 поста выше. Может это что даст...
(170кб)
СкринШот |
|
Treumer |
Отправлено: 03.03.2005, 11:14 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 92
|
QUOTE (** Harold @ 01/03/2005, 18:50) | Screen Shot на 2 поста выше. Может это что даст...
(170кб)
СкринШот |
Windows 2000 показывает только память занятую программой.
Эти "дескрипторы" вообще не показываются.
Я предполагаю — это кол-во указателей на выделенные участки памяти данной программы.
MemoLogFile->Lines — это TString, т.е. каждая строка в нем — один указатель на нее.
Попробуй по нажатию на какую-то кнопку очищать MemoLogFile->Lines, а потом погляди сколько "дескрипторов" будет показано...
Отредактировано Treumer — 03/03/2005, 11:16 |
|
Guest |
Отправлено: 03.03.2005, 11:33 |
|
Не зарегистрирован
|
Есть хорошая програмулина — TaskInfo2000 (Irasn TaskInfo). Можно попробовать посмотреть что это за дескрипторы через неё. |
|
Gedeon |
Отправлено: 03.03.2005, 11:38 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Treumer @ 03/03/2005, 09:14) | Windows 2000 показывает только память занятую программой.
Эти "дескрипторы" вообще не показываются. |
Вид->Выбрать столбцы...
|
|
Konstantine |
Отправлено: 03.03.2005, 13:01 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (Treumer @ 03/03/2005, 11:14) | MemoLogFile->Lines — это TString, т.е. каждая строка в нем — один указатель на нее. |
в мемо всё храниться в одном буфере — один указатель и записуй текста до 4 Гиг... а то что везвращает Strings[i] — это всё результат работы функций
|
|
** Admin |
Отправлено: 03.03.2005, 16:33 |
|
Не зарегистрирован
|
Судя по скриншоту, в фунции записи есть еще какие-то
строчки, кроме записи в log-файл.
Может "лишние" дескрипторы создаются там, а не в этой строчке ?
Проверить легко -
Вариант 1. Закомментируйте только эту строчку,
запустите приложение — проверьте — если кол-во
дескрипторов увеличивается — дело не в записи файла.
Вариант 2. Создайте новое приложение, бросьте
компонент Memo, Timer и эту строчку с записью -
и смотрите — будет расти кол-во дескрипторов или нет.
Этот второй вариант я проделал у себя — кол-во дескрипторов
не растет — значит дело скорее всего в чем-то другом.
И скорее всего — вот в чем: из скриншота я заметил, что у вас
в программе 5 потоков — вот тут и ищите причину утечки
дескрипторов.
|
|
** Harold |
Отправлено: 04.03.2005, 16:53 |
|
Не зарегистрирован
|
Спасибо всем за соучастие.
Будем бороться.
Может, и правда, где в потоках запутался.. в первый раз все ж..
Буду действовать методом отключения подозрительных мест
|
|