![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Unable to Write
basilcat © (2011-08-30 15:48:00)Мастера. Очень редко. Иногда раз в пять дней. Иногда сразу в первый день, а потом затишье неделю, но получаю ошибку Unable to write ... В принципе ошибка локализована. Я по мере отработки программы пишу в ини файл номера точек, которые появляются в PointNumbCurrent:TEdit. Время между записями разное, от 0,006 сек и выше:
[NachPoint]
NNKV=1605,1,999999 - 1605 меняется 1 - 999999. За диапазон не выходит :)
Проверяю перед тем как писать функцией, используется ли файл кем то другим (смогу ли я его открыть):
function FileStatus(const FileName: string): boolean;
var
F: TFileStream;
begin
try
F := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
try
Result := true;
finally
F.Free;
end;
except
Result := false;
end;
end;
Пишу стандартно:
N_NachKadr_Val:TValue;
procedure TValue.Writer;
var
IniFile:TIniFile;
begin
IniFile:=TIniFile.Create(IniFileName);
try
IniFile.WriteString(IniSection,IniName,inttostr(Value)+','+inttostr(min)+','+inttostr(max));
finally
IniFile.Free;
end;
end;
procedure Form_Aplication.PointNumbCurrentChange(Sender:TObject);
begin
...
{$I-}
if FileStatus(SKADR_Str) then
N_NachKadr_Val.Writer
{$I+}
...
end;
SKADR_Str:=ExtractFilePath(ParamStr(0))+'_point2.txt'; - имя с путём создаётся один раз во время инициализации при запуске приложения.
Пишется стандартно из модуля IniFile
procedure TIniFile.WriteString(const Section, Ident, Value: string);
begin
if not WritePrivateProfileString(PChar(Section), PChar(Ident),
PChar(Value), PChar(FFileName)) then
raise EIniFileException.CreateResFmt(@SIniFileWriteError, [FileName]);
end;
Что может быть причиной ошибки Unable to Write?
Омлет (2011-09-01 10:41:00) [21]> За пять дней записей было типа миллион (тыс по 200 в день) и ничего.
Так необходимо каждую секунду перезаписывать файл? Бред какой-то.
Германн (2011-09-01 01:05:00) [22]
> Наверное автор понимает
Надеюсь, что это так.
Во только:
basilcat (31.08.11 13:47) [17]
очень сильно смущает. Использовать ини-файла для такой цели мог только "полный неуч"!
Inovet (2011-08-31 21:29:00) [23]> [22] _Юрий (31.08.11 21:13)
> Если это так, надо бросать все остальное и заниматься решением
> именно этой проблемы.
Наверное автор понимает, что наступил на опасную ошибку, и что могут быть непредсказуемые последствия.
_Юрий (2011-08-31 21:13:00) [24]
> Скорее всего иногда затирает область памяти где хранится
> имя файла "обращение к уничтоженному объекту".
Если это так, надо бросать все остальное и заниматься решением именно этой проблемы. Вооружившись необходимыми инструментами.
basilcat (2011-08-31 14:55:00) [25]
> Всё равно, какой смысл его парсить 100+ раз в секунду. Почему
> тогда просто число в файл не сохранять может и не в текстовом
> виде?
Логично. Но всё упирается в привязку всех констант к TValue;
Попробую сделать класс и писать старым дедовским способом.
Скорее всего иногда затирает область памяти где хранится имя файла "обращение к уничтоженному объекту".
Inovet (2011-08-31 14:24:00) [26]> [17] basilcat (31.08.11 13:47)
> Это всё его содержимое
Всё равно, какой смысл его парсить 100+ раз в секунду. Почему тогда просто число в файл не сохранять может и не в текстовом виде?
Inovet (2011-08-31 14:20:00) [27]> [16] basilcat (31.08.11 13:45)
> Какое мнение по потере имени файла в приложении?
Другая ошибка. Допустим, выход за границы массива или обращение к уничтоженному объекту.
Игорь Шевченко (2011-08-31 14:05:00) [28]
> Какое мнение по потере имени файла в приложении?
Мнение, что ты партизан
basilcat (2011-08-31 13:47:00) [29]
> ИНИ файлы обрабатываются в оперативной памяти и все что
> более 64к не считается нормальным ИНИ файлом, могут быть
> любые проблемы.
> <
[NachKadr]
NNKV=9314,1,999999
32 байта
Это всё его содержимое, меняется 9314 в диапазоне 1-999999. :) Т.е. пишется всё время одно число.
basilcat (2011-08-31 13:45:00) [30]Проблема по моему локализована. По каким то невыясненным причинам теряется имя файла. При выбросе сообщения Unable to write to < здесь пусто> а должно быть имя файла. Странно, потому что полный путь к файлу создаётся:
SKADR_Str:=ExtractFilePath(ParamStr(0))+'_point2.txt'; - имя с путём создаётся один раз во время инициализации при запуске приложения. Какое мнение по потере имени файла в приложении?
Anatoly Podgoretsky (2011-08-31 12:09:00) [31]ИНИ файлы обрабатываются в оперативной памяти и все что более 64к не считается нормальным ИНИ файлом, могут быть любые проблемы.
Eraser (2011-08-31 01:47:00) [32]> [13] Германн © (31.08.11 00:37)
> Не получишь данную ошибку, но потеряешь весь "Журнал событий"
> в случае чего.
например в случае чего?
> Мой совет - не использовать ini-файлы для целей, для которых
> они не предназначены.
правильный совет.
Германн (2011-08-31 00:37:00) [33]
> Eraser © (30.08.11 23:52) [12]
>
> > [0] basilcat (30.08.11 15:48)
>
> используй TMemIniFile.
А чем это лучше?
Не получишь данную ошибку, но потеряешь весь "Журнал событий" в случае чего.
Мой совет - не использовать ini-файлы для целей, для которых они не предназначены.
Eraser (2011-08-30 23:52:00) [34]> [0] basilcat (30.08.11 15:48)
используй TMemIniFile.
Игорь Шевченко (2011-08-30 22:38:00) [35]или можешь дополнительно к WriteString вызывать UpdateFile, но это уже никому не нужное шаманство
Игорь Шевченко (2011-08-30 22:36:00) [36]If the function successfully copies the string to the initialization file, the return value is nonzero.
If the function fails, or if it flushes the cached version of the most recently accessed initialization file, the return value is zero. To get extended error information, call GetLastError.
http://msdn.microsoft.com/en-us/library/ms725501(v=vs.85).aspx
Замени TIniFile.WriteString на прямой вызов WritePrivateProfileString и смотри, что вернет GetLastError
После этого имеет смысл продолжать дискуссию
basilcat (2011-08-30 17:57:00) [37]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
>
Есть бредовое предположение, что следующее событие, инициирующее вызов PointNumbCurrentChange и соответственно новую запись в ini файл, происходит иногда раньше, чем заканчивается предыдущая запись в этот же ini файл.
basilcat (2011-08-30 17:30:00) [38]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
За пять дней записей было типа миллион (тыс по 200 в день) и ничего. Почему иногда вылетает? У кого-то было такое?
basilcat (2011-08-30 17:27:00) [39]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
Проверки FileStatus не было. Валило ошибку unable to write раз в 5 дней. Сорри. Теперь прикрутил. Жду что будет уже 8 часов. Пока полёт нормальный.
Но и до FileStatus вылетало раз в 5 дней. Вопрос, что предпринять чтобы больше не было вылетов по unable to write.
Inovet (2011-08-30 17:16:00) [40]> [5] Inovet © (30.08.11 17:14)
> Убери её.
Тебе сразу сказали
> [1] Игорь Шевченко © (30.08.11 15:54)
Но это же умничания по-твоему.