Файловые операции

 

Всем привет, столкнулся с такой проблемой!!!

Необходимо корректно открыть файл для чтения в тот момент пока его не использует никакая другая программа. Суть в чём.

Пишущий советник пишет данные в файл каждую минуту и если по инструменту в течении минуты не было тика от принудительно пишет значения этой минуты в 55 секунд текущей минуты. Тм самым исключаем пропуски минутных баров на разных инструментах. Пишет он естественно либо ноль либо предыдущее значение. НО

Другой советник читает эти в файлы через 65 секунд после появления сигнала на 5 минутке. Тол есть на 5 минут появился сигнал, советник ждёт минуту и 5 секунд и наченает считывание файлов. При таком комплекте всё работает как часы, НО есть ещё один советник который то же читает файлы но уже через 95 секунд, давая возможность сначала первому советнику прочитать, потом уже он. НО вот не задача данный советник перерисовывает последний сигнал. То есть когда первый советник стоит один проблем нет, но стоит закинуть второй как начинается чехорда. В последствии при компилировании второго сигнал принимает устойчивое положение.

Думаю проблема в том что они толкаются друг с другом и ещё и с пишущим на предмет доступа к файлам. Собственно вопрос: Подскажите изящное решение по 100% надёжности доступа к файлам для чтения????

Есть функция РидФиле, кторая жёстко закинута в цикл while. Врать не буду не до любливаю я его потому как он может запросто повесить любую машину но в данном случае использую именно его с 5 секундной задержкой после каждой итерации. Но всё таки как можно гарантированно прочитать 15 файлов и не столкнуть советника лбами????

 
По сути у меня всегда два читающих советника и постоянно скакать между ними и приписывать задержки как то уже надоело. Как сделать так что бы после того как первый советник прочитал всё что ему нужно он давал бы команду второму "Путь свободен", потому как временные задержки это же условности.
 
Mihail Marchukajtes:
Пробовали синхронизировать по времени последнего доступа?
 
Yevhenii Levchenko:
Пробовали синхронизировать по времени последнего доступа?
Нет, а вот это уже интерессно. Посмотрю на медне. Спасибо!!!
 
Mihail Marchukajtes:

Всем привет, столкнулся с такой проблемой!!!

Необходимо корректно открыть файл для чтения в тот момент пока его не использует никакая другая программа. Суть в чём.

Пишущий советник пишет данные в файл каждую минуту и если по инструменту в течении минуты не было тика от принудительно пишет значения этой минуты в 55 секунд текущей минуты. Тм самым исключаем пропуски минутных баров на разных инструментах. Пишет он естественно либо ноль либо предыдущее значение. НО

Другой советник читает эти в файлы через 65 секунд после появления сигнала на 5 минутке. Тол есть на 5 минут появился сигнал, советник ждёт минуту и 5 секунд и наченает считывание файлов. При таком комплекте всё работает как часы, НО есть ещё один советник который то же читает файлы но уже через 95 секунд, давая возможность сначала первому советнику прочитать, потом уже он. НО вот не задача данный советник перерисовывает последний сигнал. То есть когда первый советник стоит один проблем нет, но стоит закинуть второй как начинается чехорда. В последствии при компилировании второго сигнал принимает устойчивое положение.

Думаю проблема в том что они толкаются друг с другом и ещё и с пишущим на предмет доступа к файлам. Собственно вопрос: Подскажите изящное решение по 100% надёжности доступа к файлам для чтения????

Есть функция РидФиле, кторая жёстко закинута в цикл while. Врать не буду не до любливаю я его потому как он может запросто повесить любую машину но в данном случае использую именно его с 5 секундной задержкой после каждой итерации. Но всё таки как можно гарантированно прочитать 15 файлов и не столкнуть советника лбами????

Делал так: Первый советник пишет файл и ставит в глобальную переменную 2. Второй советник, увидев 2, читает файл и ставит 3. Третий, увидев 3, читает и ставит 0. Первый ...
 

Видимо, я что-не понял в условии. Почему нельзя открывать с "FILE_SHARE_READ"?

 
JRandomTrader:

Видимо, я что-не понял в условии. Почему нельзя открывать с "FILE_SHARE_READ"?

Кто сказал что нельзя?
 
А что если два файла, которые между собой синхронизируются, а советники обращаются каждый к своему?
 

Не самая лучшая идея использовать файлы для передачи данных.

Поясню. Операции записи/чтения не синхронизированы, соответственно вы не застрахованы от ситуации, когда чтение производится одновременно с записью в разных потоках, со всеми вытекающими. Почему не реализован LockFile, сия тайна покрыта мраком. Более того, никаких механизмов синхронизации между потоками в mql нет, за исключением костыля с глобальными переменными терминала (вообще-то про их потокобезопасность в документации тоже тишина).

ИМХО. Если использование dll не подходит по причине маркета, то из безопасного остается только EventChartCastom 

 
Vladimir Simakov #:

Не самая лучшая идея использовать файлы для передачи данных.

Поясню. Операции записи/чтения не синхронизированы, соответственно вы не застрахованы от ситуации, когда чтение производится одновременно с записью в разных потоках, со всеми вытекающими. Почему не реализован LockFile, сия тайна покрыта мраком. Более того, никаких механизмов синхронизации между потоками в mql нет, за исключением костыля с глобальными переменными терминала (вообще-то про их потокобезопасность в документации тоже тишина).

ИМХО. Если использование dll не подходит по причине маркета, то из безопасного остается только EventChartCastom 

тут нужно еще смотреть, что пользователь не грамотный может переключать график или период и сбивать внутренние подсчеты

 
Vladimir Simakov #:

Почему не реализован LockFile, сия тайна покрыта мраком.

потому что файлы и так лочатся по желанию пользователя на чтение и на запись, зачем наворачивать сверху велосипед?

Причина обращения: