File Mapping, как сделать правильно? - страница 3

 
Andrei01:

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

А размер этой выделенной памяти можно узнать с помощью какой-то функции?

Проверка наличие памяти нужна только, чтобы не читать и не писать где она не выделена. Вы перед получением значения переменной проверяете её наличие? Это тоже самое.

Максимально упростил всё. Не надо проверять наличие памяти, ибо она всегда есть для пользователя. Так же не надо заботится о размере памяти. Она всегда будет такой, как затребована. Нужны только функции чтения и записи.

Этот скрипт у меня работает:

#include <SharedMemory.mqh>
string sNameMemory = "MyMem";

int start()
 {
  Alert(MemoryCheckName(0, "", sNameMemory));
  MemoryClear(0, "", -1, sNameMemory); // Это просто очистка памяти. Саму область памяти не удаляет.
  Alert(MemoryCheckName(0, "", sNameMemory));
 }

Наверняка, у Вас показывает наличие памяти с таким именем из-за того, что ранее уже выделили память с таким именем. Перезагрузите комп для чистоты эксперимента.

Посмотрите тестовый скрипт. Там описано применение всех функций.

 
sergeev:

Андрей, написано ведь черным по белому - SIZE.

нет, весь массив целиком

зачем же гадать, если вам доступен ПОЛНОСТЬЮ ИСХОДНЫЙ КОД, в отличии от закрытой SharedMemoryMT4

Даже, если выложу код, то это никого не спасёт. Это 13,4 Мб моих библиотек. Кто в этом разбираться будет? Да и сам проект 1Мб.
 
sergeev:

Андрей, написано ведь черным по белому - SIZE.

зачем же гадать, если вам доступен ПОЛНОСТЬЮ ИСХОДНЫЙ КОД, в отличии от закрытой SharedMemoryMT4

SIZE имеется ввиду всего массива туда надо занести чтобы заработало? Исходные коды к сожалению не осилил, где там скрыта формула смещения чтобы всё работало, а в примерах это не понятно.
 
Andrei01:
SIZE имеется ввиду всего массива туда надо занести чтобы заработало? Исходные коды к сожалению не осилил, где там скрыта формула смещения чтобы всё работало, а в примерах это не понятно.


еще раз

int MemWrite(int hmem, int &v[], int pos, int sz, int &err[]);
int MemRead(int hmem, int &v[], int pos, int sz, int &err[]);-

pos - с какой позиции

sz - сколько байт

 
Zhunko:Посмотрите тестовый скрипт. Там описано применение всех функций.

Ну дык часть функций там нерабочие, та же MemoryCheckName().

// Это просто очистка памяти. Саму область памяти не удаляет.
Так как тогда удалить выделенную область памяти?
 
sergeev:

еще раз

pos - с какой позиции

sz - сколько байт

Аа спасибо, понял!
 
Andrei01:

Ну дык часть функций там нерабочие, та же MemoryCheckName().

Так как тогда удалить выделенную область памяти?

Привёл пример рабочий. Опять не работает? Может всё же в тестовый скрипт загляните?

Есть примеры, подробнейшие описания каждой функции... Не помогает?

Вот функции для закрытия:

 //============================================================================================================================================================
 // 2.6. Функция закрывает открытые системные дескрипторы по префиксу имени области памяти. Если префикс для имени не задан, то закрываются все открытые системные дескрипторы.
 //      Функция возращает TRUE в случае удачи или отсутствия открытых дескрипторов, или FALSE, если хотя бы один дескриптор не закрыт.
 bool MemoryCloseAll(int    nArea,        // Область памяти: MEMORY_GLOBAL    Глобальная область памяти.
                                          //                MEMORY_TERMINAL  Область памяти терминала.
                                          //                MEMORY_WINDOW    Область памяти окна.
                     string sPrefixArea,  // Дополнительный идентификатор области памяти для организации дополнительных пространств имён.
                     string sNamePrefix); // Префикс имени области памяти.
 //============================================================================================================================================================
 // 2.7. Функция закрывает системный дескриптор области памяти. Функция возращает TRUE в случае удачи, иначе FALSE.
 bool MemoryCloseHandle(int    nArea,       // Область памяти: MEMORY_GLOBAL    Глобальная область памяти.
                                            //                MEMORY_TERMINAL  Область памяти терминала.
                                            //                MEMORY_WINDOW    Область памяти окна.
                        string sPrefixArea, // Дополнительный идентификатор области памяти для организации дополнительных пространств имён.
                        int    hMemory);    // Системный дескриптор закрываемой области памяти.
 //============================================================================================================================================================
 // 2.8. Функция закрывает все системные дескрипторы файловых отображений связанных с пользовательским файлом и дескриптор пользовательского файла.
 //      Функция возращает TRUE в случае удачи или отсутствия открытых дескрипторов, или FALSE, если хотя бы один дескриптор не закрыт.
 bool MemoryCloseHandleFile(int    nArea,       // Область памяти: MEMORY_GLOBAL    Глобальная область памяти.
                                                //                MEMORY_TERMINAL  Область памяти терминала.
                                                //                MEMORY_WINDOW    Область памяти окна.
                            string sPrefixArea, // Дополнительный идентификатор области памяти для организации дополнительных пространств имён.
                            int    hFileUser);  // Системный дескриптор пользовательского файла.
 //============================================================================================================================================================
 // 2.9. Функция закрывает все системные дескрипторы по имени области памяти.
 //      Функция возращает TRUE в случае удачи или отсутствия открытых дескрипторов, или FALSE, если хотя бы один дескриптор не закрыт.
 bool MemoryCloseName(int    nArea,       // Область памяти: MEMORY_GLOBAL    Глобальная область памяти.
                                          //                MEMORY_TERMINAL  Область памяти терминала.
                                          //                MEMORY_WINDOW    Область памяти окна.
                      string sPrefixArea, // Дополнительный идентификатор области памяти для организации дополнительных пространств имён.
                      string sName);      // Имя области памяти.
 //============================================================================================================================================================

 Кстати, почитайте внимательно описание. Там описана концепция библиотеки. У каждой пользовательской области памяти может быть несколько дескрипторов. Нет смысла заморачиваться на каком-то конкретном дескрипторе. Работа идёт с одной именованной областью памяти. Дескрипторы не нужны пользователю. Все функции, кроме функций чтения/записи, нужны только для тонкой настройки работы с памятью для увеличения скорости.

 
Zhunko:

Вот функции для закрытия:

MemoryCloseName() работает, остальные функции не подходят так как невозможно узнать дескриптор. Спасибо!
 
Andrei01:
MemoryCloseName() работает, остальные функции не подходят так как невозможно узнать дескриптор. Спасибо!

Написал же выше, не нужны Вам дескрипторы!

Дескриптор можно получить функциями, которые предварительно создают и открывают отображение. Это нужно для ускорения работы с памятью. Даже в этом случае дескриптор не нужен.

Посмотрите тестовый скрипт. Там все варианты представлены.

 
Zhunko:
Написал же выше, не нужны Вам дескрипторы!

Да, но я уже потом заметил. Можно было бы все ненужное, которое тут большинство в отдельный файл поместить чтобы зря людям не рыскать по лесу. Всякие переменные типа char и т.п. тоже не актуальны для МТ4.