Il mio approccio. Il nucleo è il motore. - pagina 166

 
Nikolai Semko:
Peter, dove sono le prove?
Dov'è il rapporto di ricerca che confronta le velocità di esecuzione di un programma in un thread ex5 (non ha nemmeno senso sperimentare con ex4) e in due thread?
Era solo una supposizione ipotetica, che tra l'altro è stata dichiarata per la prima volta da me ( qui), quando non ho ricevuto da voi almeno una formulazione dei vantaggi del vostro approccio.
State già usando la mia ipotesi come un fatto.
Personalmente ammetto che potrebbe esserci un vantaggio, ma puramente per intuizione (non per conoscenza) scommetto il 75% che non darà alcun vantaggio, dato che l'interazione e lo scambio di dati tra i due programmi non è libero, e il processore è uno per entrambi gli ex5. Ma la risposta a questa domanda può essere data solo dagli sviluppatori stessi o da un esperimento qualitativo.

Posso fornirvi la prova del basso costo dello scambio di dati tra i programmi. Anche quando si passa una stringa di migliaia di caratteri. Ho fatto un esperimento. Troverò e caricherò due EA di prova. La comunicazione tramite risorse non carica il processore, ma solo il ridisegno.

Il motore accumulerà una vasta gamma di funzionalità, e solo una piccola parte - la GUI dell'utente. Cioè, il motore includerà codice che sarà solo parzialmente richiesto da un'applicazione separata, e il resto del codice può essere usato da altre applicazioni su altre grafiche. In questo modo, il motore diventa una funzionalità ausiliaria utilizzata da diversi EA allo stesso tempo, e quindi, dovrebbe essere un programma separato che gira nel proprio thread.

 

Qui. Mettilo nel primo grafico.

//+------------------------------------------------------------------+
//|                                                       TEST_2.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[32000]; uint Uint[8000];};
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(16);
   //----------------------------------------------
   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
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Char_Uint u;
   string String = NULL;
   int q = MathRand(),w = 0;
   if(q > 10000)q = 10000;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for(int a1 = 0; a1 < q; a1++)
      {
       String += (string)a1 + "^";
       w++;
       if(w == 10)
         {
          String += "$";
          w = 0;
         }
      } 
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen(String);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   StringToCharArray(String,u.Char);
   //-------------------------------------------------------
   //Cохраняем строку переведенную в байты в ресурсе.
   //-------------------------------------------------------
   if(!ResourceCreate("::Resource",u.Uint,8000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //-------------------------------------------------------
  }
//+------------------------------------------------------------------+
 

E questo è il secondo.

//+------------------------------------------------------------------+
//|                                              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

//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[32000];
   uint    Uint[8000];   
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(16); 
   
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\TEST_2.ex4::Resource"))Print("Resource is not connected!");
   else Print("Resource connected!");
//---
   return(INIT_SUCCEEDED);
  }


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Char_Uint u;   
   uint width,height;
   string msg[],pars[];
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\TEST_2.ex4::Resource",u.Uint,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   string String = CharArrayToString(u.Char);
   //-----------------------------
    ushort Msep = StringGetCharacter("^",0);
    int s = StringSplit(String,Msep,msg);
    for(int a1 = 0; a1 < s; a1++)
      {
       ushort Psep = StringGetCharacter("$",0);
       StringSplit(msg[a1],Psep,pars);
     }  
   //-----------------------------
   Alert("  String  ",String);
   //-----------------------------
    //------------------------------------------------------------------------------------------------------- 
    ArrayInitialize(u.Char,0);
    ResourceCreate("\\Indicators\\DRIVE.ex4::EA_2_DRIVE",u.Uint,8000,1,0,0,0,COLOR_FORMAT_ARGB_RAW);
    //-------------------------------------------------------------------------------------------------------      
  }
//+------------------------------------------------------------------+
 
Реter Konow:

Posso fornire la prova del basso costo dello scambio di dati tra i programmi. Anche quando si trasferisce una stringa di migliaia di caratteri. Ho fatto un esperimento. Troverò e caricherò due EA di prova. La comunicazione attraverso le risorse non carica il processore, ma solo il ridisegno.

Il motore accumulerà una vasta gamma di funzionalità, e solo una piccola parte - la GUI dell'utente. Cioè, il motore includerà codice che sarà solo parzialmente richiesto da un'applicazione separata, e il resto del codice può essere usato da altre applicazioni su altri grafici. In questo modo, il motore diventa un centro funzionale ausiliario utilizzato contemporaneamente da diversi EA, e quindi deve essere un programma separato.

Ma se un motore serve più programmi, allora tanto più rallenterà il processo generale, perché servire diversi programmi in esso avverrà in modo sequenziale, mentre le istanze della vostra classe motore in ogni applicazione verranno eseguite in parallelo.
 
Il secondo EA ha Alert. Finché è aperto, il processore sarà stressato. Non appena lo commentate, il carico scomparirà.
 
Nikolai Semko:
Ma se il vostro motore serve diverse applicazioni, allora rallenterà l'intero processo, perché servirà diversi programmi in modo sequenziale, mentre le istanze della vostra classe motore in ogni applicazione verranno eseguite in parallelo.

I programmi accederanno al motore in modo asincrono e secondo necessità. Uno chiederà di costruire un grafico basato sull'array passato, un altro di calcolare un valore usando una formula, e un terzo di fare qualcos'altro... Tutto questo non sarà un unico processo continuo, ma avverrà di volta in volta.

In questo caso, il motore porterà la GUI di una delle applicazioni, e l'utente passerà alla GUI di un'altra applicazione.

 
Se metti il motore in un'applicazione, c'è un sacco di roba inutile nell'applicazione. Quindi, è necessario personalizzare il motore alle esigenze specifiche del singolo EA. L'utente non sarà in grado di affrontarlo. È lungo e complicato. E mi impedirà di sviluppare la versatilità del motore.
 
Реter Konow:
Se metti il motore in un'applicazione, c'è un sacco di roba inutile nell'applicazione. Quindi, è necessario personalizzare il motore alle esigenze specifiche del singolo EA. L'utente non sarà in grado di affrontarlo. È lungo e complicato. E interferirà con lo sviluppo dell'universalità del motore.
È solo un insieme di parole senza alcun significato.
 
Nikolai Semko:
Solo un mucchio di parole senza alcun significato.

Prendetemi in parola. So cosa sto facendo.

 
Реter Konow:

Prendetemi in parola. So cosa sto facendo.

No, non è vero. Non è vero.