Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1268482847
Grab3
2010-03-13 15:20
2011.12.11
Не применяются изменения в таблице InterBase


15-1313305232
alexdn
2011-08-14 11:00
2011.12.11
Чисто технический вопрос


2-1314273611
lamer911
2011-08-25 16:00
2011.12.11
string to array


15-1313365562
icelex
2011-08-15 03:46
2011.12.11
Итак... Стандарт принят...


2-1314620080
guesto
2011-08-29 16:14
2011.12.11
chr(39), #39, QuotedStr( / );





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский