Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
ВнизUnable to Write Найти похожие ветки
← →
basilcat (2011-08-30 15:48) [0]Мастера. Очень редко. Иногда раз в пять дней. Иногда сразу в первый день, а потом затишье неделю, но получаю ошибку 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-08-30 15:54) [1]
> Проверяю перед тем как писать функцией, используется ли
> файл кем то другим (смогу ли я его открыть):
Это не проверка. Ini-файлы не "открываются" в Delphi-йском смысле.
← →
basilcat (2011-08-30 16:24) [2]
> Это не проверка. Ini-файлы не "открываются" в Delphi-йском
> смысле.
Предложи по другому проверить не занят ли файл чем то (хотя к нему кроме меня и господа Бога никто не обращается априори)
← →
Anatoly Podgoretsky © (2011-08-30 16:53) [3]Попробуй открыть, только не надо сюда пихать стрим
← →
basilcat (2011-08-30 17:04) [4]
> Попробуй открыть, только не надо сюда пихать стрим
Такое впечатление что вопрос не читали. Пишет 5 дней нормально. Потом УПС... unable to write. Идеи кроме умничаний есть. Стрим поставил в 7- попытке. До этого try ... хру и т.д.
← →
Inovet © (2011-08-30 17:14) [5]> [4] basilcat (30.08.11 17:04)
> Пишет 5 дней нормально. Потом УПС... unable to write
Ты проверку FileStatus прикрутил для отлова ошибки или была изначально? Убери её.
← →
Inovet © (2011-08-30 17:16) [6]> [5] Inovet © (30.08.11 17:14)
> Убери её.
Тебе сразу сказали
> [1] Игорь Шевченко © (30.08.11 15:54)
Но это же умничания по-твоему.
← →
basilcat (2011-08-30 17:27) [7]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
Проверки FileStatus не было. Валило ошибку unable to write раз в 5 дней. Сорри. Теперь прикрутил. Жду что будет уже 8 часов. Пока полёт нормальный.
Но и до FileStatus вылетало раз в 5 дней. Вопрос, что предпринять чтобы больше не было вылетов по unable to write.
← →
basilcat (2011-08-30 17:30) [8]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
За пять дней записей было типа миллион (тыс по 200 в день) и ничего. Почему иногда вылетает? У кого-то было такое?
← →
basilcat (2011-08-30 17:57) [9]
> Ты проверку FileStatus прикрутил для отлова ошибки или была
> изначально? Убери её.
>
Есть бредовое предположение, что следующее событие, инициирующее вызов PointNumbCurrentChange и соответственно новую запись в ini файл, происходит иногда раньше, чем заканчивается предыдущая запись в этот же ini файл.
← →
Игорь Шевченко © (2011-08-30 22:36) [10]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
После этого имеет смысл продолжать дискуссию
← →
Игорь Шевченко © (2011-08-30 22:38) [11]или можешь дополнительно к WriteString вызывать UpdateFile, но это уже никому не нужное шаманство
← →
Eraser © (2011-08-30 23:52) [12]> [0] basilcat (30.08.11 15:48)
используй TMemIniFile.
← →
Германн © (2011-08-31 00:37) [13]
> Eraser © (30.08.11 23:52) [12]
>
> > [0] basilcat (30.08.11 15:48)
>
> используй TMemIniFile.
А чем это лучше?
Не получишь данную ошибку, но потеряешь весь "Журнал событий" в случае чего.
Мой совет - не использовать ini-файлы для целей, для которых они не предназначены.
← →
Eraser © (2011-08-31 01:47) [14]> [13] Германн © (31.08.11 00:37)
> Не получишь данную ошибку, но потеряешь весь "Журнал событий"
> в случае чего.
например в случае чего?
> Мой совет - не использовать ini-файлы для целей, для которых
> они не предназначены.
правильный совет.
← →
Anatoly Podgoretsky © (2011-08-31 12:09) [15]ИНИ файлы обрабатываются в оперативной памяти и все что более 64к не считается нормальным ИНИ файлом, могут быть любые проблемы.
← →
basilcat (2011-08-31 13:45) [16]Проблема по моему локализована. По каким то невыясненным причинам теряется имя файла. При выбросе сообщения Unable to write to <здесь пусто> а должно быть имя файла. Странно, потому что полный путь к файлу создаётся:
SKADR_Str:=ExtractFilePath(ParamStr(0))+"_point2.txt"; - имя с путём создаётся один раз во время инициализации при запуске приложения. Какое мнение по потере имени файла в приложении?
← →
basilcat (2011-08-31 13:47) [17]
> ИНИ файлы обрабатываются в оперативной памяти и все что
> более 64к не считается нормальным ИНИ файлом, могут быть
> любые проблемы.
> <
[NachKadr]
NNKV=9314,1,999999
32 байта
Это всё его содержимое, меняется 9314 в диапазоне 1-999999. :) Т.е. пишется всё время одно число.
← →
Игорь Шевченко © (2011-08-31 14:05) [18]
> Какое мнение по потере имени файла в приложении?
Мнение, что ты партизан
← →
Inovet © (2011-08-31 14:20) [19]> [16] basilcat (31.08.11 13:45)
> Какое мнение по потере имени файла в приложении?
Другая ошибка. Допустим, выход за границы массива или обращение к уничтоженному объекту.
← →
Inovet © (2011-08-31 14:24) [20]> [17] basilcat (31.08.11 13:47)
> Это всё его содержимое
Всё равно, какой смысл его парсить 100+ раз в секунду. Почему тогда просто число в файл не сохранять может и не в текстовом виде?
← →
basilcat (2011-08-31 14:55) [21]
> Всё равно, какой смысл его парсить 100+ раз в секунду. Почему
> тогда просто число в файл не сохранять может и не в текстовом
> виде?
Логично. Но всё упирается в привязку всех констант к TValue;
Попробую сделать класс и писать старым дедовским способом.
Скорее всего иногда затирает область памяти где хранится имя файла "обращение к уничтоженному объекту".
← →
_Юрий (2011-08-31 21:13) [22]
> Скорее всего иногда затирает область памяти где хранится
> имя файла "обращение к уничтоженному объекту".
Если это так, надо бросать все остальное и заниматься решением именно этой проблемы. Вооружившись необходимыми инструментами.
← →
Inovet © (2011-08-31 21:29) [23]> [22] _Юрий (31.08.11 21:13)
> Если это так, надо бросать все остальное и заниматься решением
> именно этой проблемы.
Наверное автор понимает, что наступил на опасную ошибку, и что могут быть непредсказуемые последствия.
← →
Германн © (2011-09-01 01:05) [24]
> Наверное автор понимает
Надеюсь, что это так.
Во только:
basilcat (31.08.11 13:47) [17]
очень сильно смущает. Использовать ини-файла для такой цели мог только "полный неуч"!
← →
Омлет © (2011-09-01 10:41) [25]> За пять дней записей было типа миллион (тыс по 200 в день) и ничего.
Так необходимо каждую секунду перезаписывать файл? Бред какой-то.
← →
Ega23 © (2011-09-01 11:26) [26]Звиздец.
2.5 раза в секунду:
1. Создаётся и тут же убивается FileStream c ShareExclusive.
2. Создаётся TIniFile
3. В нём делается апдейт одного единственного строкового значения.
4. TIniFile убивается.
Казнить.
← →
Anatoly Podgoretsky © (2011-09-01 13:34) [27]> Омлет (01.09.2011 10:41:25) [25]
В сутках вообще то всего 86400 секунд, так что значительно чаще.
← →
Омлет © (2011-09-01 13:42) [28]> Anatoly Podgoretsky © (01.09.11 13:34) [27]
> так что значительно чаще.
Я округлил )
← →
Anatoly Podgoretsky © (2011-09-01 13:54) [29]> Омлет (01.09.2011 13:42:28) [28]
Нифига себе у тебя округлялка, тебе так зря плату так округлить?
← →
Inovet © (2011-09-01 14:27) [30]> [0] basilcat (30.08.11 15:48)
> Время между записями разное, от 0,006 сек и выше
До 100+ раз в секунду.
← →
Anatoly Podgoretsky © (2011-09-01 15:03) [31]> Inovet (01.09.2011 14:27:30) [30]
С ИНИ не получится, из-за принципов работы. Будет часто "Unable to Write"
← →
basilcat (2011-09-01 18:09) [32]
> Так необходимо каждую секунду перезаписывать файл? Бред
> какой-то.
Не бред, а необходимость. Если рубанёт питание, то легко выйти в нужную точку и продолжить. На глазок не подходит.
← →
basilcat (2011-09-01 18:12) [33]Кстати 32 часа полёт нормальный именно с FileStatus. Прогон идёт на 3-х компах. Пока всё ОК.
← →
basilcat (2011-09-01 18:15) [34]
> Во только:
> basilcat (31.08.11 13:47) [17]
> очень сильно смущает. Использовать ини-файла для такой цели
> мог только "полный неуч"!
Это моя система управления. Покажи свои работы в промышленности.
basil-cat.narod.ru , basilcat.at.ua
← →
Дмитрий Белькевич (2011-09-01 18:46) [35]
> Казнить.
Нужно же чем-то процессор занимать :)
← →
Омлет © (2011-09-02 07:51) [36]> Если рубанёт питание, то легко выйти в нужную точку и продолжить.
Для этого есть бесперебойные источники питания.
При отрубании питания скорее у вас файл будет испорчен, чем сохранено последнее значение (вспомним про кэширование записи на диск).
← →
Anatoly Podgoretsky © (2011-09-02 08:49) [37]> Омлет (02.09.2011 07:51:36) [36]
Для этого есть раиды с батарейкой на 72 часа.
Подход не верный, или все гори синим пламенем, или бабки гони.
← →
Inovet © (2011-09-02 09:25) [38]> [37] Anatoly Podgoretsky © (02.09.11 08:49)
> с батарейкой на 72 часа
Достаточно получить сигнал о потере питания от оборудования, записать ОДИН раз последний номер опереции, и можно отключиться. Так что обычный бесперебойник потянет, разве что целый цех с конвейерами и сотенями станков на этом компе висит, но сто-то мне подсказывает, что это не так.
← →
Anatoly Podgoretsky © (2011-09-02 09:32) [39]Без всего это ни о каком сохранение и речи быть не может, только о порче системе, но она видимо ничего не стоит.
← →
Ega23 © (2011-09-02 11:00) [40]
> Это моя система управления. Покажи свои работы в промышленности.
Вот поэтому у нас такой бардак. И в промышленности тоже. Понаберут по объявлениям, а потом удивляемся: "А чой-то ВАЗ - ведро с гайками, почему не могут как Мерседес".
Вот потому и не могут.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c