Mon approche. Le noyau est le moteur. - page 166

 
Nikolai Semko:
Peter, où est la preuve ?
Où est le rapport de recherche comparant les vitesses d'exécution d'un programme dans un seul thread ex5 (il est même inutile d'expérimenter avec ex4) et dans deux threads ?
Ce n'était qu'une supposition hypothétique, qui, soit dit en passant, a été énoncée pour la première fois par moi ( ici), lorsque je n'ai pas reçu de votre part au moins une formulation des avantages de votre approche.
Vous utilisez déjà mon hypothèse comme un fait.
Personnellement, j'admets qu'il peut y avoir un avantage, mais par pure intuition (et non par connaissance) je parie à 75% que cela ne donnera aucun avantage, puisque l'interaction et l'échange de données entre les deux programmes n'est pas libre, et que le processeur est unique pour les deux ex5. Mais la réponse à cette question ne peut être donnée que par les développeurs eux-mêmes ou par une expérience qualitative.

Je peux vous fournir la preuve du faible coût de l'échange de données entre programmes. Même en passant une chaîne de milliers de caractères. J'ai fait une expérience. Je vais trouver et télécharger deux EAs de test. La communication via les ressources ne charge pas le processeur, mais uniquement le redécoupage.

Le moteur accumulera un large éventail de fonctionnalités, et seulement une petite partie - l'interface graphique de l'utilisateur. Autrement dit, le moteur comprendra un code qui ne sera que partiellement requis par une application distincte, et le reste du code pourra être utilisé par d'autres applications sur d'autres graphiques. De cette manière, le moteur devient une fonctionnalité auxiliaire utilisée par différents EA en même temps, et doit donc être un programme distinct fonctionnant dans son propre thread.

 

Ici. Mettez-le sur le premier graphique.

//+------------------------------------------------------------------+
//|                                                       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!");
   //-------------------------------------------------------
  }
//+------------------------------------------------------------------+
 

Et celui-ci est sur la deuxième.

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

Je peux apporter la preuve du faible coût de l'échange de données entre programmes. Même lors du transfert d'une chaîne de milliers de caractères. J'ai fait une expérience. Je vais trouver et télécharger deux EAs de test. La communication par le biais de ressources ne charge pas le processeur, mais uniquement le redécoupage.

Le moteur accumulera un large éventail de fonctionnalités, et seulement une petite partie - l'interface graphique de l'utilisateur. Autrement dit, le moteur comprendra un code qui ne sera que partiellement requis par une application distincte, et le reste du code pourra être utilisé par d'autres applications sur d'autres graphiques. De cette façon, le moteur devient un centre fonctionnel auxiliaire utilisé par différentes EA en même temps, et doit donc faire l'objet d'un programme distinct.

Mais si un moteur sert plusieurs programmes, il ralentira d'autant plus le processus global, car le service des différents programmes se fera de manière séquentielle, alors que les instances de votre classe de moteur dans chaque application fonctionneront en parallèle.
 
La deuxième EA a Alert. Tant qu'il est ouvert, le processeur est sollicité. Dès que vous l'aurez commenté, la charge disparaîtra.
 
Nikolai Semko:
Mais si votre moteur sert plusieurs applications, il ralentira l'ensemble du processus, car il servira différents programmes de manière séquentielle, alors que les instances de votre classe de moteur dans chaque application fonctionneront en parallèle.

Les programmes accèdent au moteur de manière asynchrone et selon les besoins. L'un demandera de construire un graphique basé sur le tableau qui lui est passé, l'autre de calculer une valeur en utilisant une formule, le troisième quelque chose d'autre... Tout ceci ne sera pas un processus unique et continu, mais se produira de temps en temps.

Dans ce cas, le moteur portera l'interface graphique d'une des applications, et l'utilisateur passera à l'interface graphique d'une autre application.

 
Si vous mettez le moteur dans une application, il y a beaucoup de choses inutiles dans l'application. Vous devez donc adapter le moteur aux besoins spécifiques de chaque EA. L'utilisateur ne pourra pas y faire face. C'est long et compliqué. Et cela m'empêchera de développer la polyvalence du moteur.
 
Реter Konow:
Si vous mettez le moteur dans une application, il y a beaucoup de choses inutiles dans l'application. Vous devez donc adapter le moteur aux besoins spécifiques de chaque EA. L'utilisateur ne pourra pas y faire face. C'est long et compliqué. Et cela va interférer avec le développement de l'universalité du moteur.
Ce n'est qu'un ensemble de mots sans aucune signification.
 
Nikolai Semko:
Juste un tas de mots sans aucun sens.

Croyez-moi sur parole. Je sais ce que je fais.

 
Реter Konow:

Croyez-moi sur parole. Je sais ce que je fais.

Non, vous ne le faites pas. Tu ne le fais pas.