Обмен информацией между терминалами через разделяемую память - очень просто и наглядно.

 

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

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


Советники (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 , для тех, кто любит все делать по правилам.

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

Файлы:
 
Вы бы вместо выделения шрифтом своих изысканий приложили бы тесты скорости обмена, ибо я где-то читал на форуме, что вызов dll под МТ4 довольно медленный процесс, что успешно преодолели в МТ5. Тики можно передавать? не будет пропусков?
 
IgorM:
Вы бы вместо выделения шрифтом своих изысканий приложили бы тесты скорости обмена, ибо я где-то читал на форуме, что вызов dll под МТ4 довольно медленный процесс, что успешно преодолели в МТ5. Тики можно передавать? не будет пропусков?

Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.
 
делали уже ведь маппинг...
 
more, не вижу у вас в исходнике функции, освобождающей ресурсы мап-файла после окончания использования. Или я чего-то недопонимаю?
 
alsu:
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, если оставить их без перезагрузки денька на три. Сжирается почти вся виртуалка, причем какой процесс за ее выделение отвечал - не докопаться.

 

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.
 
more:

Вот возьми, сам протестируй и приложи нам тесты скорости обмена, можешь и с тиками попробовать, потом расскажешь.


спс - пока не до этой проблемы,

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

 
Zhunko:

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.


Работа конечно фундаментальная, но для меня, к примеру, неподъемная - 83 функции, разделенные на 10 групп....ну кто в этом будет разбираться ?

Мне, к примеру, легче было обратиться к первоисточнику и реализовать минимальную базовую версию этого подхода.

В этой базовой версии легко разобраться и на ее основе уже городить свой огород, кому что нравится.

 
Zhunko:

Чем это не понравилось?

Все проблемы решены. В том числе синхронизация.
лично мне это нравится.