Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
MQL5 Cloud Network это сеть распределенных вычислений. Оцени сам!
Invest777 Krutoj
696
Invest777 Krutoj 2011.01.19 20:18 
Доброго времени суток ! Столкнулся с такой ошибкой : в цикле через определенный период времени открывается и считывается файл html с помощью скрипта https://www.mql5.com/ru/articles/1544, ReportHTMLtoSCV.mq4 . Все какбы хорошо, но до определенного момента на 16-том повторе открыть файл html выдает ошибку -  FileOpen - too many opened files. и уже не открывает его, хотя как так получается если все 15 раз до етого все открывалось а на 16 уже выдает ошибку, а процесс все тотже . Подскажите кто знает в чем может быть дело ?
Файлы:
Владимир Тезис
4266
Владимир Тезис 2011.01.19 20:20  
FileOpen - too many opened files - слишком много открытых файлов.
Invest777 Krutoj
696
Invest777 Krutoj 2011.01.19 20:29  
drknn:
FileOpen - too many opened files - слишком много открытых файлов.
спасибо, ето я знаю, но как применить ето к данной ситуации ?, получается что открываемые html файлы не были закрыты или как ? но функция FileClose(),  присутсвует потому не должно такого быть
Vadim Zhunko
5226
Vadim Zhunko 2011.01.19 21:11  
Invest777:
спасибо, ето я знаю, но как применить ето к данной ситуации ?, получается что открываемые html файлы не были закрыты или как ? но функция FileClose(), присутсвует потому не должно такого быть
Проверять на ошибки надо, и если они есть, то закрывать файл. По моему, не помню точно, количество одновременно открытых файлов не более 32.
Владимир Тезис
4266
Владимир Тезис 2011.01.21 05:27  

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

В случае, если открываемый Вами файл содержит всего одну строку (или файл пустой), то что происходит? В цикле счётчик строк принимает значение = 1, и сразу за циклом Вы вычитаете 1 из счётчика - он обнуляется. Далее Вы проверяете, если счётчик более нуля, то отдаёте приказ закрыть файл. А если менее нуля или равно нулю? То файл остаётся открыт!!!

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

Владимир Тезис
4266
Владимир Тезис 2011.01.21 13:57  
Invest777, Пишу этот пост специально чтоб поднять ветку вверх форума, чтоб она не затерялась в последующих страницах. Вы так и не отписались по результатам. Как там у Вас дела с кодом?
Invest777 Krutoj
696
Invest777 Krutoj 2011.01.21 15:27  
drknn:

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

В случае, если открываемый Вами файл содержит всего одну строку (или файл пустой), то что происходит? В цикле счётчик строк принимает значение = 1, и сразу за циклом Вы вычитаете 1 из счётчика - он обнуляется. Далее Вы проверяете, если счётчик более нуля, то отдаёте приказ закрыть файл. А если менее нуля или равно нулю? То файл остаётся открыт!!!

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



спасибо большое за розяснение  , буду пробывать, так как я логически тоже понимаю проблему, но вопрос как в коде все правельно описать, вроде функция закрытия файла присутствует, потому нелогично что файлы остаються открытыми.А если ошибка закрытия, то по какой причине ...
Владимир Тезис
4266
Владимир Тезис 2011.01.21 18:02  
Invest777:


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


Вот так:

// ------------------- FileTodayCreate() ---------------------------------------------------------
// функция создаёт файл-выборку из указанного файла в указанный файл
// -----------------------------------------------------------------
void FileTodayCreate(string DB_File,string RezFile){
        string          NameFunction="FileTodayCreate()",Stroka,s_TempDate,s_TempTime,s_Rezult;
        int             SchStrokInFile;
        int             Fl_Hndl=(-1);
        
        SchStrokInFile=(-1);
        SchStrokInFile=SchFileStrok(DB_File);
        Fl_Hndl=FileOpen(DB_File,FILE_CSV|FILE_READ,";");// открываем основной файл (базу данных).
        if(Fl_Hndl>(-1)){
          for(int down=1;down<=SchStrokInFile;down++){
            // тут у Вас что-то происходит в цикле
          }
                
        }
        FileClose(Fl_Hndl);// Закрываем файл
}
Invest777 Krutoj
696
Invest777 Krutoj 2011.01.22 14:03  
а вот еще вопрос по массивам, если использовать функцию ArrayInitialize, с помощью нее можно обнулить массив типа double, но как обнулить массив типа string ?
o_O
Модератор
23617
o_O 2011.01.22 14:13  
Invest777:
а вот еще вопрос по массивам, если использовать функцию ArrayInitialize, с помощью нее можно обнулить массив типа double, но как обнулить массив типа string ?
в цикле.
Invest777 Krutoj
696
Invest777 Krutoj 2011.01.22 14:20  
sergeev:
в цикле.


а можно пожалуйсто в коде описать ?
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий