Работа двух шаблонов с одним файлом с данными.

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Друзья, помогите с мыслями. Работаю над разработкой шаблона и не могу придумать корректную реализацию одного момента. Два шаблона, один собирает данные и ложит (дописывает) их в файл, второй берет из этого файла данные и удаляет взятое. Второй шаблон будет работать во много потоке, возможно и первый тоже. Вопрос. При такой схеме, возможна же потеря данных в файле или сбоя одного из шаблонов по причине того, что в момент обращения одного из шаблонов к файлу он может быть занят другим шаблоном. Как избежать это?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
оно по идее должно нормально работать когда не одновременно в тот же миг, иначе надо ловить ошибку обращения к файлу и запускать паузу в цикле пока не попадёт на свободный момент, не знаю может и на кубиках можно сделать, либо try использовать
 
  • Спасибо
Реакции: one

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Вот в этом и проблема. Шаблоны будут работать не зависимо друг от друга и вероятность одновременного обращения к файлу высока. Может в одном из шаблонов ставить в начале цикла проверку на занятость файла? Каким образом?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
C#:
try
    {
        File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
этот код будет вызывать эксепшион при одновременном чтении или записи (FileAccess.ReadWrite) , а FileShare.None - Отклоняет совместное использование текущего файла
я не знаю, просто как в зенкепри открытии файла, устанавливается ли FileShare , если устанавливается FileShare.None , то кубик взятия или записи строки в файл будет вызывать ошибку и тогда на кубиках можно сделать обработку по красной ветке, например цикл повторять запись или взятие пока не будет успеха
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Понятно, спасибо! Попробую предложенное решение.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
...цикл повторять запись или взятие пока не будет успеха
Это не сможет привести случайно к бесконечному циклу, если к примеру файл потеряется либо его невозможно будет прочитать?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Это не сможет привести случайно к бесконечному циклу, если к примеру файл потеряется либо его невозможно будет прочитать?
если, то да, надо добавлять проверки, просто с чего бы ему теряться или его нельзя будет прочитать? я о таком даже и не думал как то, может этот как раз тот случай - пока петух не клюнет))
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
если, то да, надо добавлять проверки, просто с чего бы ему теряться или его нельзя будет прочитать? я о таком даже и не думал как то, может этот как раз тот случай - пока петух не клюнет))
Я из-за таких проблем ушел работать на выделенный сервер - у меня постоянно (почти каждый день) выключают электричество.
Если в тот момент Зенно работал с файлом - то при следующем запуске проблема - файл не читаемый.
Из-за чего переспросил - чтобы знать как решать эти проблемы, ведь при старте уйдет в бесконечный цикл.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
так ты вроде и с БД всегда работаешь. мне вот по БД пока знаний не хватает, у нас из-за этого одно дельце застопорилось, а сам пока не вникаю - ещё пока си шарп подтягиваю
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
так ты вроде и с БД всегда работаешь. мне вот по БД пока знаний не хватает, у нас из-за этого одно дельце застопорилось, а сам пока не вникаю - ещё пока си шарп подтягиваю
С БД я сейчас работаю почти всегда.
Но, иногда удобнее работать с файлами (шаблон быстрее пишется) - так что знания в этом направлении не помешают.
Впрочем, если кому-то чего-то на заказ писать - то не всем подойдет работа с БД.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
попытался погуглить - как не потерять файл при отключении электричества, так ничего и не нашёл... но ворд и эксель не теряют же данные при отключении во время работы в их же программах, значит можно как-то
 
  • Спасибо
Реакции: BAZAg

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
но ворд и эксель не теряют же данные при отключении во время работы
У них параллельно создается резервный файл при каждом обращении к исходному файлу для таких случаев. Продумано все. :-)
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
У них параллельно создается резервный файл при каждом обращении к исходному файлу для таких случаев. Продумано все. :-)
да, я так тоже начал делать и всё дублирую в другой файл, но! когда работает сразу больше даже 15 потоков, при при срыве один поток может записывать в основной, а 10-й поток например в дублирующий)) это что тогда дублирующий файл для каждого потока делать?) думал у них как-то подругому реализовано это, а получается, что так же, что ли? у них то нет многопотока, им проще)
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

Yurii

Client
Регистрация
04.02.2016
Сообщения
94
Благодарностей
9
Баллы
8

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
попытался погуглить - как не потерять файл при отключении электричества, так ничего и не нашёл... но ворд и эксель не теряют же данные при отключении во время работы в их же программах, значит можно как-то
Элементарно, Ватсон. Просто создается бэкап копия файла, куда и делается выгрузка нужных данных. При сохранении данных в зеннопостере эта бэкап копия записывается в основную. Аналогичное и можно провернуть в зеннопостере, только в c# надо разбираться.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Элементарно, Ватсон. Просто создается бэкап копия файла, куда и делается выгрузка нужных данных. При сохранении данных в зеннопостере эта бэкап копия записывается в основную. Аналогичное и можно провернуть в зеннопостере, только в c# надо разбираться.
бэкап при многопотоке не поможет, я же выше написал, нам тогда для каждого потока свой бэкап надо делать, но может это единственное решение, а может ты имеешь в виду другой бэкап?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
просто можно и без си шарпа на кубиках забэкапить с дубликатом, но когда много потоков, то дофига файлов будет создаваться и костыли для костылей надо ещё сообразить))
 

Dimazzan

Client
Регистрация
05.11.2014
Сообщения
341
Благодарностей
127
Баллы
43
А можно просто купить ИБП
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113

Dimazzan

Client
Регистрация
05.11.2014
Сообщения
341
Благодарностей
127
Баллы
43

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
164
Баллы
43
:D

А если использовать БД, то описанная выше проблема снимается?
mySQL своими внутренними средствами лочит данные на момент обращения
И в случае обращения потоков к базе
mySQL поставит в очередь запросы от потоков - так что данные не потеряются
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
В общем сделал я свой выбор реализации задуманного с использованием MySQL. Вещь! :-)
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)