Réaliser un projet de crowdsourcing sur Canvas - page 17

 
o_O:

Create_resource(string Resource_name

Nom_de_la_ressource - à quelle fréquence change-t-il ? combien de ressources sont en mémoire ?

Littéralement quelques-uns. Ça dépend du nombre de fenêtres ouvertes. Actuellement, je travaille avec 1 ou 2 fenêtres à la fois. Chaque fenêtre comporte 3-4 objets bitmap. Il s'agit d'environ 8 ressources. (Je pense que ce n'est pas suffisant pour ralentir...)

Mise à jour de Windows sur les événements de l'interface (maintenant seulement sur les clics, les autres événements étant désactivés). En même temps, il ralentit immédiatement, pas après un certain temps. Au premier clic. En outre, je vois clairement un lien entre la "puissance de freinage" et la taille des fenêtres. Plus la fenêtre est grande, plus la réponse de l'image est lente.

Notez également que ResourceCreate() n'arrive pas immédiatement, mais après avoir "rempli" le tableau local avec une image, c'est-à-dire après tous les calculs de couleur et l'initialisation du tableau d' images. Je pense que c'est le problème.

 

Pour conclure, je vais stocker l'image dans un tableau statique ou global. Sur les événements d'interface, je mettrai à jour la fenêtre immédiatement en envoyant ResourceCreate()- sans initialiser le tableau local et appeler ColorToARGB().

Si après cela l'effet de ralentissement disparaît - alors le problème est celui que j'ai décrit. Si ce n'est pas le cas, le problème se situe ailleurs.

Demain, je vais essayer de le vérifier. Après l'expérience, j'écrirai sur les résultats.

 
exécuté avec un profileur.
 
o_O:
l'exécuter avec un profileur.
Je le ferai demain. Ok. )
 

@Peter Konow, pourquoi tant de mots anglais dans le code ?

Passez au russe pur :

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}
 
Andrey Khatimlianskii:

@Peter Konow, pourquoi tant de mots anglais dans le code ?

Passez au russe pur :

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

C'est encore mieux.

 
Igor Volodin:

#define целочисленное int
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart


пустой Начнем()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

C'est encore mieux.

suivant - remplacez #define par '#define'.

ajouté : transformer la "perte" en "bénéfice".
etc...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

пст исток()
{
   цл нмр = 0;             // сокращение от номер.
   пока( нмр < 10 )
   {
      вывод( "номер = ", нмр, "!" );
      нмр ++;

   }

}
Eclairez-le correctement et il ne sera pas pire, à mon avis.
 
Andrey Khatimlianskii:

@Peter Konow, pourquoi tant de mots anglais dans le code ?

Passez au russe pur :

#define целочисленное int
#define пока while
#define Печатать Print

void OnStart()
{
        целочисленное номер = 0;
        пока ( номер < 10 )
        {
                Печатать( "номер = ", номер, "!" );
                номер ++;
        }
}

La suggestion est intéressante, j'y ai pensé. Cependant, il y a des avantages à combiner deux langues.

Si un programme est écrit dans une seule langue (même s'il s'agit de la langue maternelle), la vue est progressivement "escamotée" par la monotonie du texte.

L'alternance de noms de fonctions et de variables en russe, et d'identifiants anglais pour les événements, les propriétés, les constantes et les opérateurs, crée le contraste nécessaire à une meilleure lecture.

Par conséquent, je ne passe pas complètement au russe. Cependant, le russe domine toujours, et il aide beaucoup à naviguer dans les grands codes.

 

donc avec le début de la première version du travail de stylisme.

L'implémentation du schéma ressemble à ceci

**************

enAttrName - liste (extensible) d'attributs de l'élément à rendre

//------------------------------------------------------------------    enum enAttrName
enum enAttrName // возможные аттрибутов контрола
{
        // шрифт
        anFontName, // имя
        anFontColor, // цвет
        anFontSize, // размер
        anFontWeight, // толщина
        anFontStyle, // стиль
        // фон
        anBackgroundColor, // цвет
        anBackgroundFill, // заливка
        // граница
        anBorderColor, // цвет
        anBorderWidth, // толщина
        // выравнивание
        anAlign,
        anVAlign

по мере необходимости добавлять нужные аттрибуты
};


cet attribut est stocké dans une classe GAttr

class GAttr // класс для установки значения в конкретный аттрибут
{
        enAttrName m_attr; // имя аттрибута
        // его значение
        long lval;
        double dval;
        string sval;
};

il ressemble un peu à MqlParam, mais contrairement à lui, il est indépendant du type d'objet.

------

puis les attributs sont regroupés dans une liste GAttrReflect. Cette liste fera référence à un certain état d'une certaine classe.

class GAttrReflect
{
        GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};

Une caractéristique importante de cette classe est qu'un attribut ne peut pas être répété deux fois dans m_list. Lorsque vous mettez à jour un attribut, il est écrasé ou un attribut est créé s'il n'existait pas.

-------

Chaque contrôle possède plusieurs de ces listes. Chacun d'entre eux fait référence à un reflet de l'état d'un contrôle. Cette liste de réflexions est extensible.

enum enAttrReflect // виды состояний - реакция контрола на своё состояние
{
        arDefault, // состояние по-умолчанию
        arDisable, // недоступен для ввода/неактивный
        arTransp, // должен стать прозрачным
        arSelect, // выбран
        arCheck, // отмечен
        arOver, // мышка над объектом
        arFocus, // получен фокус ввода

по мере необходимости добавлять новые рефлекты
};

En conséquence, on peut définir des attributs pour chaque commande (classe) pour chacun de ses réflexes.

Une classe - GAttrClass - stocke la liste de réflexion d'une classe particulière.

class GAttrClass
{
        string m_class; // для какого класса составлен список
        GAttrReflect reflect[arLast]; // список рефлектов класса
};

-------

Et enfin, la dernière classe, GThema, gère l'ensemble des classes qui existent et sont créées par vous.

class GThema
{
        GAttrClass* m_list[]; // список классов
};

Cette classe utilise le même principe que la liste d'attributs : il ne peut y avoir deux classes portant le même nom dans la liste.

Grâce à la surcharge de l'opérateur[], nous pouvons spécifier de manière pratique les noms des paramètres.

// задаём в классе GButton - цвет текста при наведении указателя мышки
g_thema["GButton"][arOver][anFontColor]=XRGB(255, 255, 255);

// или можно так
GAttrClass* at = g_thema["GButton"];
GAttrReflect* vl = at[arDefault];
vl[anFontColor] = XRGB(255, 255, 255);

---------

Et enfin, voici comment nous obtenons le paramètre d'intérêt du sujet de la classe

1. trouver la m_classe requise dans la liste
2. S'il est trouvé, cherchez un réflexe en lui,
3. s'il est trouvé, alors nous recherchons l'attribut
4. si aucun attribut n'est trouvé, alors nous cherchons un réflexe par défaut et un attribut dans celui-ci
Si l'attribut ne se trouve pas dans le réflecteur par défaut, répétez les étapes 1 à 4 pour le nom de classe par défaut (m_class=NULL), qui est commun à tous les éléments.

---------
l'avantage de cette approche :
- il y a toujours une classe par défaut avec laquelle on peut s'entendre et ne pas en créer de nouvelles.
- vous pouvez utiliser seulement le défaut arDefault au lieu de créer des réflexes
- vous n'avez pas à spécifier de propriétés dans chaque contrôle. Il suffit d'ajouter la classe à GThema et d'en extraire les données.
- tous les attributs qui n'ont pas été spécifiés dans la classe dans le réflecteur sont obtenus hiérarchiquement à partir du réflecteur par défaut ou de la classe par défaut.