C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Периодическая запись в лог-файл, почему-то растет кол-во дескрипторов...
** 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 лишних мегов ОЗУ, сейчас же память не проблема, если без утечек. (Память растет — понятно, а дескрипторы-то почему растут?)
"\\" +" \\"  — сам не понял, наверное, между группами слешей когда-то было что-то еще.... wink.gif
Gedeon
Отправлено: 01.03.2005, 17:10


Ветеран

Группа: Модератор
Сообщений: 1742



Если рухнет приложение с открытым файлом, файл не испортится, закрывать или держать открытым ИМХО зависит от того насколько часто идет запись, у меня для этих целей есть функция скормил имя файла и строку, а она открыла, записала, закрыла, и не парюсь.
От видимости контрола обьем памяти не зависит, но вместо невидимого мемо лучше использовать TStringList. Что касается визуально удобно, то по моему открыть этот файл в фаре например и смотреть там не менее удобно + все возможности поиска, печати и т.д. Но если иногда надо то ничего не мешает отобразить мемо и помимо файла пресовать строки в него.
А что это вообще за дескрипторы? Не реестра ли? Что авторы имели ввиду ведь дескрипторов м.б. немеряно окон, фалов, ключей реестра еще черти чего. У себя посмотрел 7270 вроде как для всего перечисленного дохеровато wink.gif . И почему Вас смущает их увеличение, если закрыть прогу, к-рая их наплодила, они уменьшаются?
** Harold
Отправлено: 01.03.2005, 17:41


Не зарегистрирован







user posted image
** Harold
Отправлено: 01.03.2005, 17:45


Не зарегистрирован







Да, пропадают. Если исключить запись в лог — дескрипторы эти вообще на растут... Просто пугает их количество через часов 8 ... типа, 24869 штук. Прога не падает, работает... Сколько их вообще допустимо (max)?
Gedeon
Отправлено: 01.03.2005, 17:59


Ветеран

Группа: Модератор
Сообщений: 1742



Так а что это вообще такое? Эти дескрипторы, дескрипторы чего?
** Harold
Отправлено: 01.03.2005, 18:45


Не зарегистрирован







Не знаю. Windows не говорит. Наверное, при открытии файла создеется новый дескриптор? Не знаю... ohmy.gif

Словарь: 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


Не зарегистрирован







Спасибо всем за соучастие.
Будем бороться.
Может, и правда, где в потоках запутался.. в первый раз все ж..
Буду действовать методом отключения подозрительных мест
smile.gif

Вернуться в Вопросы программирования в C++Builder