Мой подход. Ядро - Движок. - страница 94

 
Vitaly Muzichenko:

Прекрасный монолог)

Гамлет отдыхает.)

 
Реter Konow:

Ну, и что не так?

ошибка - 

ERR_RESOURCE_NOT_FOUND

https://www.mql5.com/ru/docs/runtime/resources

Читаем справку . 

Цитата:

 Напомним, что для использования ресурса из mql5-программы его необходимо 
указывать в виде: <путь_имя_файла_EX5>::<имя_ресурса>.
 
Nikolai Semko:

https://www.mql5.com/ru/docs/runtime/resources

Читаем справку . 

Цитата:

Да. Разобрался. Неверно подключал.

 
Реter Konow:
Я вот подумал. Есть способ пользоваться ресурсами других программ. Наверное, решение там. Щас поищу в документации.

Неверно подключал ресурс.

Необходимо указать путь к программе, ресурс которой мы хотим прочесть.

В Ините читающей программы, нужно установить подключение к файлу ресурса в другой программе:

if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\Tester EA.ex4::Resource"))Print("Resource is not connected!");

И при чтении ресурса, тоже указывать полный путь:

if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",Data,width,height))Print("Failed to read resource!  ",GetLastError());

//--------------------------------------------

Но, возникла новая ерунда:

При чтении ресурса возникают кракозябры в строке. Вот код:

void OnTimer()
  {
//---
   uchar Arr[];
   uint Data[],width,height;
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",Data,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   ArrayCopy(Arr,Data);
   //-----------------------------
   string Message = CharArrayToString(Arr);
   //-----------------------------
   Print(Message);
  }

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

И как с этим быть?

ЗЫ. Попробую указать другие кодировки страниц в CharArrayToString().

 

Интересно, что размер строки кракозябр соответствует размеру массива с сообщением.

Но, в потоке кракозябр иногда мелькают почти точные значения Bid, которые записываются на второй стороне. Они мелькают один раз, и внутри них тоже есть одна - две кракозябры. Но они читабельны. А потом, снова поток кракозябр.

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

Значит, нужна точная синхронизация чтения/записи?


ЗЫ. Уважаемый fxsaber можете пояснить, что здесь не так?

Прилагаю файлы:

Файлы:
 
Реter Konow:

ЗЫ. Уважаемый fxsaber можете пояснить, что здесь не так?

Здесь многие видят сразу ваши ошибки, но предпочитают молчать, т.к. чревато. И я их отлично понимаю. Наперед скажу, что отвечать после не буду. Учитесь искать свои ошибки самостоятельно и должным образом выстраивать отношение к себе окружающих.


По коду.

Копируете uint в uchar через ArrayCopy - ошибка.

CharArrayToString - работать будет, если строки ANSI.


Разберитесь с особенностями байтового представления типов.

 
fxsaber:

Здесь многие видят сразу ваши ошибки, но предпочитают молчать, т.к. чревато. И я их отлично понимаю. Наперед скажу, что отвечать после не буду. Учитесь искать свои ошибки самостоятельно и должным образом выстраивать отношение к себе окружающих.


По коду.

Копируете uint в uchar через ArrayCopy - ошибка.

CharArrayToString - работать будет, если строки ANSI.


Разберитесь с особенностями байтового представления типов.

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

По коду. Спасибо. Попробую разобратся.

 

Блин, короче надоело. Пол дня убил на это решение.

Уже и в юнионах разобрался. Но это решение, - костыль в кубе. Там еще байтовые операции нужны. А для моих задач это вообще неактуально.

Куда проще через описание объектов работать. Гарантированно и просто. А ресурсы неизвестно ли будут работать через тестер. Овчинка выделки не стоит...

Вот решение через юнионы:

//+------------------------------------------------------------------+
//|                                                    Tester EA.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[8];
   uint    Uint[2];  
   double  Double; 
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   //----------------------------------------------
   if(!ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0))Print("Object is not created!  ",GetLastError());
   else Print("Object created!");
   //-------------------------------
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource"))Print("BMPFILE is not created!");
   else Print("BMPFILE created!");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //---------------------------
   Char_Uint u;
   //---------------------------
   u.Double = Bid;
   //---------------------------
   if(!ResourceCreate("::Resource",u.Uint,2,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //---------------------------   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   
  }
//+------------------------------------------------------------------+

И читающий индикатор:

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar Char[8]; 
   uint  Uint[2]; 
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(5250); 
   
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\Tester EA.ex4::Resource"))Print("Resource is not connected!");
   else Print("Resource connected!");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Char_Uint u;
   uint width,height;
   string Message; 
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\Tester EA.ex4::Resource",u.Uint,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   Message = CharArrayToString(u.Char);
   //-----------------------------
   Print(Message);
   //-----------------------------
  }
//+------------------------------------------------------------------+
 

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

В общем, не понятно как все это должно работать... 

Может потом найду решение....

 

Юнионы, конечно, интересная штука. Однако, не приходит в голову для каких задач (кроме сохранения в ресурсе) это может быть полезно. 

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