Библиотеки: File Mapping без DLL - страница 10

 
o_o:

Хорошо хоть не пробуете прочитать файл в памяти после перезапуска компьютера...


Ну то есть я понял, что мне таким образом не удастся передавать данные через память между двумя терминалами?

А какой путь будет корректным? Нужно реализовать передачу строки текста из одного терминала в другой с помощью MemMapLib.mqh.

 
Иван:

Ну то есть я понял, что мне таким образом не удастся передавать данные через память между двумя терминалами?

удастся

Нужно реализовать передачу строки текста из одного терминала в другой с помощью MemMapLib.mqh.

создаете файл, записываете, потом читаете

примерно в таком порядке

https://www.mql5.com/ru/code/10571

 
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);

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

У меня после 4096 начинает валиться эксперт на этом месте.

 
Код и распринтовку приведите
 

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

 
Алексей Барбашин:

Получается <..>

не получается.

Код и распринтовку приведите

 
o_o:

не получается.

Код и распринтовку приведите


   string control_text = "Наша мама громко плачет, потому-что все свинячат. Тише мамочка, не плач! У других такой же срач...";
   string NAME_MAPPING = "Local\\" + Symbol() + "_" + (string)ChartID();
        
   uchar Data_sender[];
   int size_data = StringToCharArray(control_text, Data_sender);

   //--- Создаем объект работы с памятью
   CMemMapFile* MappingFile = new CMemMapFile();
   //--- Создаем файл для записи
   long err = MappingFile.Open(NAME_MAPPING, size_data+4, modeCreate);
        
   //--- Записываем данные в файл
   err = MappingFile.Write(Data_sender, size_data);
        
   //--- Закрываем запись
   MappingFile.Close();
   //--- Удаляем указатель
   delete MappingFile;
   
   uchar Data_receiver[];
   ArrayResize(Data_receiver, size_data);
   
   //--- Создаем объект работы с памятью
   CMemMapFile* MF = new CMemMapFile();
   //--- Открываем файл на чтение
   err = MF.Open(NAME_MAPPING, size_data+4, modeOpen);
   //--- Сдвигаем указатель чтения на начало файла
   MF.Seek(0,SEEK_SET);
   //--- Читаем данные из файла
   err=MF.Read(Data_receiver, size_data);
   //--- Закрываем файл      
   MF.Close();
   //--- Удаляем указатель
   delete MF;

   Print(CharArrayToString(Data_receiver));

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

 
Алексей Барбашин:

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

//--- Закрываем запись

это называется не закрываем запись, а закрываем и удаляем файл .

поэтому

//--- Открываем файл на чтение
вы пытаетесь открывать то, чего уже нет.
 
o_o:

это называется не закрываем запись, а закрываем и удаляем файл .

поэтому

вы пытаетесь открывать то, чего уже нет.

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

 
o_o:

это называется не закрываем запись, а закрываем и удаляем файл .

поэтому

вы пытаетесь открывать то, чего уже нет.

Просмотрев код библиотеки я увидел что файл удаляется не только при непосредственном вызове функции Close() класса CMemMapFile, но и при удалении указателя на объект этого класса, так как в деструкторе класса вызывается данная функция. Я немного в недоумении. Получается что динамический метод создания объектов класса использован быть не может, если запись и чтение файла используются в разных контекстах вызова (областей видимости). К примеру один график терминала записывает данные в файл, второй читает данные и удаляет этот файл. Получается что переменную объекта нужно всегда держать на глобальном уровне, чтобы файл принудительно не удалялся. Так же не ясно можно ли обходиться без указания размера считываемых данных. То есть при записи размер данных нам известен, но при чтении на другом графике нам заранее размер данных может быть не известен, как например в случае со строчными величинами. Вероятно либо я что-то недопонял, либо есть что еще подкрутить в библиотеке.

Виноват. Перепроверил без использования указателя, следовательно без применения delete. В этом случае при выходе из области видимости (из функции) локальная переменная объекта класса уничтожается без явного вызова деструктора.

Остался вопрос с размером принятых данных на стороне получателя. 

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