La toile est cool ! - page 90

 
Nikolai Semko #:

Un canevas est un objet auquel est lié un tableau de pixels. La ressource est chargée de lier ce tableau de pixels (voir bool CCanvas::Create())
Il n'est pas judicieux de supprimer et de recréer un canevas en permanence.
Il est judicieux de créer un canevas lorsque l'on en a besoin et de le supprimer lorsqu'il n'est plus nécessaire, par exemple à la fin d'un programme.

Une fois que vous avez créé un objet canevas, vous pouvez le nettoyer, écraser le tableau de pixels à chaque image, redimensionner le canevas et le déplacer où vous voulez.

Merci, c'est devenu un peu plus clair, mais pas tout. Est-ce que je comprends bien que si après avoir créé un objet canvas, je supprime simplement l'objet du graphique en utilisant ObjectDelete(), alors le tableau de pixels lié à cet objet reste intact et... Lorsque je crée un nouvel objet canvas avec un nom différent, un nouveau tableau de pixels est créé en mémoire, et donc, théoriquement, il est possible de remplir toute la mémoire ?

Ou bien l'ancien tableau de pixels est-il simplement lié à nouveau au dernier objet canvas créé à chaque fois (parce que c'est et seulement avec lui que toutes les fonctions de l'instance utilisée de la classe canvas commencent à fonctionner) ?

 
leon_17 #:

Merci, c'est devenu un peu plus clair, mais pas entièrement. Est-ce que je comprends bien que si après avoir créé un objet canvas, je supprime simplement l'objet du graphique en utilisant ObjectDelete(), alors le tableau de pixels lié à cet objet reste intact et.... Lorsque je crée un nouvel objet canvas avec un nom différent, un nouveau tableau de pixels est créé en mémoire, et il est donc théoriquement possible de remplir toute la mémoire ?

Bien sûr, les ressources sans propriétaire vont se multiplier.

leon_17 #:

Ou encore, l'ancien tableau de pixels est simplement lié à nouveau au dernier objet kanvas créé à chaque fois (parce que c'est et seulement avec lui que toutes les fonctions de l'instance utilisée de la classe kanvas commencent à fonctionner).

Votre imagination est superbe. Je vous envie. Je n'aurais jamais pensé à une telle chose. :))

Cependant, si vous sauvegardez le nom d'une ressource sans propriétaire, vous pouvez le relier à un nouvel objet bitmap. Mais cela relève du domaine de la schizophrénie.

 
Nikolai Semko #:

Toutefois, si vous enregistrez le nom d'une ressource sans propriétaire, vous pouvez le lier à un nouvel objet bitmap. Mais cela relève du domaine de la schizophrénie.

Je retire ce que j'ai dit. Je pense avoir trouvé un cas où une telle chose pourrait être utile.
 
Nikolai Semko #:
Je retire ce que j'ai dit. Je pense avoir trouvé un cas où cela pourrait être utile.

Merci, je voulais juste comprendre ce qui se passe en mémoire si on utilise ObjectDelete () au lieu de Destroy (). Et j'ai réalisé que dans un tel cas, les ressources graphiques (tableaux de pixels sans propriétaire et autres) seront multipliées si un nouveau nom est généré à chaque fois pour un nouvel objet canvas.

Et si j'utilise ObjectDelete(), mais que jecrée ensuite un objet canvas avec le même nom, le tableau de pixels sera-t-il ancien ou toujours nouveau ?

p.s. les questions sont probablement stupides, mais j'en ai besoin pour comprendre le mécanisme du canvas


.

 
leon_17 #:

Merci, je voulais juste comprendre ce qui se passe en mémoire si on utilise ObjectDelete () au lieu de Destroy (). Et j'ai réalisé que les ressources graphiques (tableaux de pixels sans propriétaire et autres) vont se multiplier si un nouveau nom est généré pour un nouvel objet canvas à chaque fois.

Il est facile de vérifier cela en écrivant un simple script
 
Nikolai Semko #:
Il est facile de le vérifier en écrivant un simple script.

Pouvez-vous m'expliquer comment faire ?

 
leon_17 #:

Pouvez-vous me dire comment ?

comme ceci :

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected

void OnStart() {
   while(!IsStopped()) {
      int Width =(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину окна
      int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту окна
      CCanvas canvas;
      if(!canvas.CreateBitmapLabel("MyCanva"+string(rand()),0,0,Width,Height,COLOR_FORMAT_ARGB_NORMALIZE)) {
         Print("Error creating canvas: ",GetLastError());
      }
      canvas.FillRectangle(rand()%Width/2,rand()%Height/2,Width/2+rand()%Width/2,Height/2+rand()%Height/2,ARGB(128,rand()%255,rand()%255,rand()%255));
      canvas.Update();
      Comment("Задействовано памяти: - " + string(TerminalInfoInteger(TERMINAL_MEMORY_USED))+ " Mb");
      Sleep(500);
      ObjectDelete(canvas.m_chart_id,canvas.m_objname);
   }
}

et regardez le commentaire :

! !! après avoir exécuté ce script, n'oubliez pas de recharger le terminal pour libérer de la mémoire pour les ressources orphelines.


 
Nikolai Semko #:

comme ceci :

et regardez le commentaire :

! !! après avoir exécuté ce script, n'oubliez pas de recharger le terminal pour libérer de la mémoire pour les ressources orphelines.


Merci beaucoup pour votre aide ! Je n'ai jamais travaillé avec la mémoire de cette manière auparavant, je vais le tester.
Merci pour l'indication que les ressources orphelines sont supprimées lors du rechargement du terminal ! Beaucoup de choses de ce genre ne sont pas encore évidentes pour moi.

p.s. : tout est parfait dans cet exemple ! Il y a quelque chose à regarder, quelque chose à penser et une occasion d'expérimenter... Le code est court.

 
Pouvez-vous m'en dire plus, si kanvas est utilisé dans un Expert Advisor, est-il nécessaire d'exécuter Destroy() lors du retrait de l'Expert Advisor du graphique et de la fermeture du terminal ? Je ne sais pas non plus comment vérifier cela. Je parle d'un canevas de travail avec un objet fixe. Là, la différence de mémoire est dans l'erreur (si vous exécutez et n'exécutez pas Destroy ().
 
leon_17 retrait de l'Expert Advisor du graphique et de la fermeture du terminal ? Je ne sais pas non plus comment vérifier cela. Je parle d'un canevas de travail avec un objet fixe. Là, la différence de mémoire est dans l'erreur (si vous exécutez et n'exécutez pas Dest roy ().

Ce n'est pas nécessaire. Dans le destructeur du canevas, il est automatiquement exécuté :

                    ~iCanvas() { Destroy(); ChartRedraw();};
Raison: