Jump to content
Sign in to follow this  
Л_Е_О

MMF - обмен данными между терминалами, советниками через виртуальные файлы ?!

Recommended Posts

AntFX

Схему с удалением файлов нужно менять на что-то другое, если делать копировщик по типу "многие ко многим", то есть когда один файл могут читать несколько получателей. Тогда нужно поплясать с бубном и придумать промежуточную ступень перед удалением файла, или вовсе отказаться от удаления )

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Player 2

С мьютексом это всё делается проще, как по мне.

Share this post


Link to post
Share on other sites
AntFX

Что удобно с файлами - встроенная поддержка MQL формата CSV - то есть любые структуры удобно считывать и записывать в файлы, преобразуя в строки. Получается логичный и хорошо читаемый код (и сами файлы), хотя конечно быстрее было бы работать с бинарными массивами. Но тут как правило нет таких объемов данных, на которых скорость преобразования CSV в числа и обратно как-то существенно влияет на быстродействие процесса.

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Aequo_animo

  В общем сегодняшние эксперименты :

      -- максимальный размер файла который можно передать 65536 байт , иначе ошибка и остановка советника

      -- при Sleep(1) в теле бесконечного цикла эти 65536 байт передаются 750 в секунду , загрузка моего ЦП 1,2Гц , на уровне 10%

      -- если Sleep(0) соответственно загрузка ЦП 100%

      -- в среднем 3 раза в секунду файл передаётся не полностью , т.е ошибка одновременно доступа 

 

  Проверял на целостность файла так : при каждой передаче инкрементировал первый элемент массива , и приравнивал к последнему , потом передавал . При приёме сравнивал первый и последний элемент , если не равны соответственно файл(массив) не целый.

Share this post


Link to post
Share on other sites
Aequo_animo

  Интересный эффект обнаружил , если окно метатрейдера сделать не активным (кликнуть например по рабочему столу или свернуть) все ошибки передачи прекращаются , но передача происходит на той же скорости .

Share this post


Link to post
Share on other sites
Player 2

 

 

-- максимальный размер файла который можно передать 65536 байт , иначе ошибка и остановка советника

Странно, я передавал по несколько мегабайт без проблем.

Share this post


Link to post
Share on other sites
Aequo_animo

 

 

Странно, я передавал по несколько мегабайт без проблем.

   Если хотя бы на 1 байт больше , то  "Access violation write to 0x00000000 in 'msvcr100.dll'  "

А вот что в интернетах пишут Windows выравнивает начало каждого региона зарезервированного адресного пространства в соответствии с гранулярностью выделения памяти (allocation granularity). Это значение можно получить через Windows-функцию GetSystemInfo. B настоящее время оно равно 64 Кб.
Думаю из-за этого .

Share this post


Link to post
Share on other sites
Player 2

 

 

Если хотя бы на 1 байт больше , то "Access violation write to 0x00000000 in 'msvcr100.dll' "

Размер файла указан достаточный?

 

 

 

Думаю из-за этого .

Вряд ли. Это грануляция выделения. То есть если выделяете меньше 64КБ, то будет выделено 64КБ. Если размер файла указан меньше чем 64КБ, то такое может быть, но зачем указывать маленький размер когда вам надо передать гораздо больший объем?

Share this post


Link to post
Share on other sites
Aequo_animo

 

 

Размер файла указан достаточный?

Ну да , я там заменил во всей программе на  #define , быстренько менял и смотрел результат . Результат на лицо . Я думаю это ограниченность методов конкретно msvcr100.dll , а не методов memory-mapped-файлов . А у Вас получалось потому как вы без участия этой библиотеки делали , я так думаю .

Share this post


Link to post
Share on other sites
Player 2

 

 

Я думаю это ограниченность методов конкретно msvcr100.dll , а не методов memory-mapped-файлов .

Это нарушение доступа, значит есть обращение к памяти которая не выделена. Это может быть указан недостаточный размер файла в функциях CreateFileMapping и MapViewOfFile, либо недостаточный размер массива MQL.

Функция memmove при попытке копировать блок выходит за пределы выделенной памяти, поэтому валится именно она.

Share this post


Link to post
Share on other sites
Aequo_animo

 

 

Это нарушение доступа, значит есть обращение к памяти которая не выделена. Это может быть указан недостаточный размер файла в функциях CreateFileMapping и MapViewOfFile, либо недостаточный размер массива MQL.

Вроде правильно .

 

Функция memmove при попытке копировать блок выходит за пределы выделенной памяти, поэтому валится именно она.

Согласен . Будем надеяться  , что никому не понадобиться передавать так много .

Share this post


Link to post
Share on other sites
Player 2

Мне даже самому стало интересно что там может падать. Вот я записал 800 000 байт в файл из массива и скопировал обратно из файла в другой массив. Никаких ошибок.

//+------------------------------------------------------------------+
//|                                                          xxx.mq4 |
//|                                             Copyright © 2007 sss |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007 sss"
#property link      ""

#include <stdlib.mqh>

#import "kernel32.dll"
      int CreateFileMappingA(int h, int ihv, int PRW, int LD, int WD, string Name);
      int CloseHandle(int hMapFile);
      int MapViewOfFile(int hMapFile, int ppp, int jjj, int bb, int ff);
      int UnmapViewOfFile(int hMap);
   
#import "msvcr100.dll"
      int memmove(int hMap, double& St[], int bb);
      int memmove(double& st[], int hMap, int bb);
#import

int hMapFile;
double array[100000];
double array1[100000];
int hMap;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


int init()
  {
//----
   Print("Enter init.");
   hMapFile = CreateFileMappingA(-1, NULL, 4, 0, 800000, "MMFile");
   hMap = MapViewOfFile(hMapFile, 2, 0, 0, 800000);
   array[99999] = 555;
   memmove(hMap, array, 800000);
   memmove(array1, hMap, 800000);
   Print("Value: " + array1[99999]);
   UnmapViewOfFile(hMap);
   CloseHandle(hMapFile);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
  • Thanks 1

Share this post


Link to post
Share on other sites
Aequo_animo

Видимо я лошара :) , неправильно рассчитывал размер файла .Не мог правильно сложить 65536+8. Человеческий фактор . У меня теперь тоже работает .

Edited by Aequo_animo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×