Прошу помочь в разрешении следующей проблемы. У меня одним файлом пользуются две программы, одна из них советник в терминале. Советник открывает файл исключительно для чтения, а вот другая программа пользует файл для изменения монопольно. Бывают моменты (это я так думаю), когда советник пытается открыть файл, а в это время там орудует конкурент. Не знаю какие коллизии там происходят, в финале терминал начинает жрать ресурсы, снять советника не могу, только с закрытием терминала, а в файл уже ничего не пишется. Коллапс. Я вообще то считал, что когда файл открывается только для чтения, просто делается его копия и никому она не мешает. Можно ли каким-нибудь образом избежать вышеописанное? Или надо показывать код?
- Генерация включаемого кода - Разработка программ
- Шаблоны и профили - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ
- Создание и работа с проектом - Проекты и MQL5 Storage
Лучше всего показывать код.
И делать диспетчер доступа к файлу например на основе глобальной переменной. Без диспетчеризации доступа всегда будут проблемы.
И делать диспетчер доступа к файлу например на основе глобальной переменной. Без диспетчеризации доступа всегда будут проблемы.
ОК. Предварительно поясню что где. На минутном графике советник мониторит файл 1, если произошло изменение файла, он пишет его содержимое в файл 2 (ведется лог).
string str="Начинаем работу!",tt; int start() {//1 //---- int handle,cnt,tt3,han1; string Mod,Com,tt2; Comment(str); if (Volume[0] ==1) {//2 handle=FileOpen("1.txt",FILE_READ,";"); if(handle==-1){Print("Error - ",GetLastError());return(0);} tt2=FileReadString(handle); if(tt==tt2) {//3 FileClose(handle); return(0); }//3 tt=tt2; tt3=StrToInteger(FileReadString(handle)); Mod=FileReadString(handle); Com=FileReadString(handle); str=TimeToStr(tt3,TIME_MINUTES); FileClose(handle); han1=FileOpen("2.txt",FILE_READ|FILE_WRITE,";"); FileSeek(han1, 0, SEEK_END); FileWrite(han1,tt,Mod,Com,";"); FileClose(han1); }//2 //---- return(0); }//1
Про диспетчеризацию, мне что надо еще в программе, изменяющей файл 1 какие то метки выдавать? Это проблематично. Хотелось бы решить все проблемы на стороне советника.
Спасибо.
Проблемы начинаются при обычной работе или при прогоне в тестере?
Код работы с файлами вызывается всего один раз на бар - это достаточно редко.
Вероятно, проблема совсем в другом месте - ведь предоставлен не весь эксперт, а лишь его часть.
Код работы с файлами вызывается всего один раз на бар - это достаточно редко.
Вероятно, проблема совсем в другом месте - ведь предоставлен не весь эксперт, а лишь его часть.
Это весь советник. В данном случае я его использую, чтобы проверить прохождение и дохождение сигналов для потребителя. Как только я получу удовлетворительные результаты я просто вставлю эту часть кода в нормальный торгующий советник. И сейчас я имею проблемы именно с этим советником при обычной работе.
А можете Вы мне сказать, что может произойти, если я открою файл для чтения советником, а в это время другая программа откроет этот файл монопольно и у нее отработает эксепшн? Ничего с дискриптором произойти не может?
Спасибо.
А можете Вы мне сказать, что может произойти, если я открою файл для чтения советником, а в это время другая программа откроет этот файл монопольно и у нее отработает эксепшн? Ничего с дискриптором произойти не может?
Спасибо.
А можете Вы мне сказать, что может произойти, если я открою файл для чтения советником, а в это время другая программа откроет этот файл монопольно и у нее отработает эксепшн? Ничего с дискриптором произойти не может?
С дескриптором ничего страшного не произойдет, но что в результате считается из файла - неизвестно. Добавьте отладочные строки с выводом в логи - может проявятся детали.
Приходит файл в виде строки:
1141283280;1141293456;2006.03.02 07:10:04;123901;;,
где первый элемент - порядковый номер, второй - текущая дата, третий - тоже, но в удобном формате, четвертый - адрес источника. Лог пишется в виде:
1141283280;2006.03.02 07:10:04;123901;;
1141283282;2006.03.02 07:20:06;123901;;
1141283283;2006.03.02 07:25:01;123901;;
1141283284;2006.03.02 07:30:00;123901;;
1141283285;2006.03.02 07:36:22;123901;;
Но я думаю, если Вы слету не увидели ошибку, значит что-то не так в программе, изменяющей файл.
Буду искать.
Тогда попутно еще вопрос, можно ли узнать, что интересующий меня файл изменился, не открывая его, а прочитав каким-нибудь образом дату обновления?
Спасибо.
1141283280;1141293456;2006.03.02 07:10:04;123901;;,
где первый элемент - порядковый номер, второй - текущая дата, третий - тоже, но в удобном формате, четвертый - адрес источника. Лог пишется в виде:
1141283280;2006.03.02 07:10:04;123901;;
1141283282;2006.03.02 07:20:06;123901;;
1141283283;2006.03.02 07:25:01;123901;;
1141283284;2006.03.02 07:30:00;123901;;
1141283285;2006.03.02 07:36:22;123901;;
Но я думаю, если Вы слету не увидели ошибку, значит что-то не так в программе, изменяющей файл.
Буду искать.
Тогда попутно еще вопрос, можно ли узнать, что интересующий меня файл изменился, не открывая его, а прочитав каким-нибудь образом дату обновления?
Спасибо.
В общем нашел я причину своих проблем, может кому будет полезно узнать о найденном. Во первых, установил, что файл, даже в режиме "только для чтения", открывается в монопольном режиме, и всем другим в этот файл доступ уже закрыт, что мне очень не нравится. Во-вторых, если количество данных в файле меньше требуемого для считывания, то советник подвисает, ожидая, когда ему преподнесут недостающее и начинает жутко грузить процессор. Так у меня и получалось, когда из-за глюков по связи приходил пустой файл, советник открывал файл и, не найдя там никаких данных, просто зависал. Вышел из ситуации, установив простой семафор.
Но вопрос попробую оставить - каким образом можно узнать об изменении файла, не открывая его?
Спасибо.
Но вопрос попробую оставить - каким образом можно узнать об изменении файла, не открывая его?
Спасибо.
Но вопрос попробую оставить - каким образом можно узнать об изменении файла, не открывая его?
Из MQL4 - никак, только через внешнюю DLL.
Во-вторых, если количество данных в файле меньше требуемого для считывания, то советник подвисает, ожидая, когда ему преподнесут недостающее и начинает жутко грузить процессор.
Это обязательно проверим, спасибо!
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь