Скачать MetaTrader 5

Открытие файла

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114296
Forex Trader  
Прошу помочь в разрешении следующей проблемы. У меня одним файлом пользуются две программы, одна из них советник в терминале. Советник открывает файл исключительно для чтения, а вот другая программа пользует файл для изменения монопольно. Бывают моменты (это я так думаю), когда советник пытается открыть файл, а в это время там орудует конкурент. Не знаю какие коллизии там происходят, в финале терминал начинает жрать ресурсы, снять советника не могу, только с закрытием терминала, а в файл уже ничего не пишется. Коллапс. Я вообще то считал, что когда файл открывается только для чтения, просто делается его копия и никому она не мешает. Можно ли каким-нибудь образом избежать вышеописанное? Или надо показывать код?
MetaQuotes Software Corp.
Модератор
188252
MetaQuotes Software Corp.  
Лучше всего показывать код.
И делать диспетчер доступа к файлу например на основе глобальной переменной. Без диспетчеризации доступа всегда будут проблемы.
Forex Trader
114296
Forex Trader  
ОК. Предварительно поясню что где. На минутном графике советник мониторит файл 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 какие то метки выдавать? Это проблематично. Хотелось бы решить все проблемы на стороне советника.
Спасибо.

MetaQuotes Software Corp.
Модератор
188252
MetaQuotes Software Corp.  
Проблемы начинаются при обычной работе или при прогоне в тестере?
Код работы с файлами вызывается всего один раз на бар - это достаточно редко.

Вероятно, проблема совсем в другом месте - ведь предоставлен не весь эксперт, а лишь его часть.
Forex Trader
114296
Forex Trader  
Это весь советник. В данном случае я его использую, чтобы проверить прохождение и дохождение сигналов для потребителя. Как только я получу удовлетворительные результаты я просто вставлю эту часть кода в нормальный торгующий советник. И сейчас я имею проблемы именно с этим советником при обычной работе.
А можете Вы мне сказать, что может произойти, если я открою файл для чтения советником, а в это время другая программа откроет этот файл монопольно и у нее отработает эксепшн? Ничего с дискриптором произойти не может?
Спасибо.
MetaQuotes Software Corp.
Модератор
188252
MetaQuotes Software Corp.  
А можете Вы мне сказать, что может произойти, если я открою файл для чтения советником, а в это время другая программа откроет этот файл монопольно и у нее отработает эксепшн? Ничего с дискриптором произойти не может?

С дескриптором ничего страшного не произойдет, но что в результате считается из файла - неизвестно. Добавьте отладочные строки с выводом в логи - может проявятся детали.
Forex Trader
114296
Forex Trader  
Приходит файл в виде строки:
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;;
Но я думаю, если Вы слету не увидели ошибку, значит что-то не так в программе, изменяющей файл.
Буду искать.
Тогда попутно еще вопрос, можно ли узнать, что интересующий меня файл изменился, не открывая его, а прочитав каким-нибудь образом дату обновления?
Спасибо.
Forex Trader
114296
Forex Trader  
В общем нашел я причину своих проблем, может кому будет полезно узнать о найденном. Во первых, установил, что файл, даже в режиме "только для чтения", открывается в монопольном режиме, и всем другим в этот файл доступ уже закрыт, что мне очень не нравится. Во-вторых, если количество данных в файле меньше требуемого для считывания, то советник подвисает, ожидая, когда ему преподнесут недостающее и начинает жутко грузить процессор. Так у меня и получалось, когда из-за глюков по связи приходил пустой файл, советник открывал файл и, не найдя там никаких данных, просто зависал. Вышел из ситуации, установив простой семафор.
Но вопрос попробую оставить - каким образом можно узнать об изменении файла, не открывая его?
Спасибо.
MetaQuotes Software Corp.
Модератор
188252
MetaQuotes Software Corp.  
Но вопрос попробую оставить - каким образом можно узнать об изменении файла, не открывая его?

Из MQL4 - никак, только через внешнюю DLL.

Во-вторых, если количество данных в файле меньше требуемого для считывания, то советник подвисает, ожидая, когда ему преподнесут недостающее и начинает жутко грузить процессор.

Это обязательно проверим, спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий