Вы бы вместо выделения шрифтом своих изысканий приложили бы тесты скорости обмена, ибо я где-то читал на форуме, что вызов dll под МТ4 довольно медленный процесс, что успешно преодолели в МТ5. Тики можно передавать? не будет пропусков?
Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.
more, не вижу у вас в исходнике функции, освобождающей ресурсы мап-файла после окончания использования. Или я чего-то недопонимаю?
Дело в том, что долго не получалась связь, пока не вычитал такую фишку при описание функции OpenFileMapping(...) -
If there is an open handle to a file mapping object by this name and the
security descriptor on the mapping object does not conflict
with the dwDesiredAccess parameter, the open operation succeeds. Здесь в выделенном тексте говорится о необходимости существования открытого хэндлера для данного
имени отображаемого объекта, причем на момент открытия нового хэндлера в другом процессе.
Как только я просек этот момент, сразу же закомментил освобождение ресурсов в функции создания отображаемого объекта и все заработало.
Вот это место - две строки перед return(nrue) :
//+------------------------------------------------------------------+ //| WriteSharedMemory() | //+------------------------------------------------------------------+ bool WriteSharedMemory() { HANDLE hMapFile; char *pBuf; hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // maximum object size (high-order DWORD) BUF_SIZE, // maximum object size (low-order DWORD) (LPCSTR) szName); // name of mapping object if (hMapFile == NULL) return(false); pBuf = (char *) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); if (pBuf == NULL) {CloseHandle(hMapFile); return(false);} for (i = 0; szMsg[i]; i++) {pBuf[i] = szMsg[i];} pBuf[i] = szMsg[i]; // UnmapViewOfFile(pBuf); // CloseHandle(hMapFile); return(true); } // bool WriteSharedMemory()
Разумеется, в приведенной выше функции необходимо отслеживать наличие/отсутствие данного ресурса и поступать соответствующим образом, ведь
это просто демонстрация.
Одно понятно, при освобождение ресурса в приведенной выше функции, связь через память прекращается.
Получается, что хэндлер, выдаваемый системой при создание этого поименованного ресурса, надо держать открытым.
Память все равно надо освобождать, иначе программа потечет. Имеется в виду, что когда маппинг уже не нужен, все объекты надо корректно удалить и отдать ресурс системе. По идее, этим должен бы заниматься тот же модуль, который создает ресурс, но в данном случае это правило не всегда применимо, т.к. последний процесс, использующий мап, может быть не тем же самым, который его создал. Это дело надо бы отслеживать.
Что получается, когда работа с памятью ведется невнимательно, можно видеть на примере Висты и Вин7, если оставить их без перезагрузки денька на три. Сжирается почти вся виртуалка, причем какой процесс за ее выделение отвечал - не докопаться.
Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.
спс - пока не до этой проблемы,
я почему то решил, что Вы на общественном форуме пытаетесь по взаимообмену полезную информацию дать/поделиться, а Вы моральным самоудовлетворением занимаетесь -не буду мешать, успехов
Работа конечно фундаментальная, но для меня, к примеру, неподъемная - 83 функции, разделенные на 10 групп....ну кто в этом будет разбираться ?
Мне, к примеру, легче было обратиться к первоисточнику и реализовать минимальную базовую версию этого подхода.
В этой базовой версии легко разобраться и на ее основе уже городить свой огород, кому что нравится.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В порядке изучения возможностей обмена информацией между советниками, работающими на разных терминалах
написал демо-программки, демонстрирующие один из возможных подходов, очень простые и наглядные. Кому интересно, можете поиграться.
Советники (ExpertSharedMemory.mq4) запускаются на разных терминалах и обмениваются между собой информацией через доступную
для всех совместно используемую оперативную память. Доступ к этой памяти обеспечивается DLL-программой – SharedMemoryDLL.dll,
экспортируемой функцией – string GetStringValue(string).
Вы можете через extern – параметр задать функцию работы с разделяемой памятью-
Function_W_R = "R" - читать
Function_W_R = "W" – писать
Информацию для записи также задается через extern –параметр
Read_Write_Buffer.
Для любознательных привожу ссылку, где изложена теория этого подхода
http://msdn.microsoft.com/en-us/library/aa366791%28v=vs.85%29.aspx…….
А также прикрепляю файлы:
1. ExpertSharedMemory.mq4 – сам советник, запускаемый в МТ4
2. SharedMemoryDLL.cpp – исходник DLL –программы на c++
SharedMemoryDLL.def - файл с определениями функций, экспортируемых из DLL
3. SharedMemoryDLL.dll - собранная dll, ее необходимо поместить в каталог
…expert\libraries\
4. Программа Widows-установки SetupSharedMemoryDLL.dll , для тех, кто любит все делать по правилам.
Получилась очень наглядная демонстрация взаимного обмена информацией между советниками, работающими в разных терминалах.