Realización de un proyecto crowdsourced en Canvas - página 17

 
o_O:

Crear_recurso(cadena Nombre_del_recurso

Nombre_del_recurso - ¿con qué frecuencia cambia? ¿cuántos recursos hay en la memoria?

Literalmente, unos pocos. Depende de cuántas ventanas estén abiertas. Actualmente estoy trabajando con 1 o 2 ventanas a la vez. Cada ventana tiene 3-4 objetos de mapa de bits. Resultan unos 8 recursos. (Creo que no es suficiente para frenar...)

Actualización de Windows en los eventos de la interfaz (ahora sólo en los clics, otros eventos desactivados). Al mismo tiempo, se ralentiza inmediatamente, no después de un tiempo. En el primer clic. Además, puedo ver claramente una correlación entre la "potencia de frenado" y el tamaño de la ventana. Cuanto más grande sea la ventana, más lenta será la respuesta de la imagen.

Y también tenga en cuenta que ResourceCreate() no llega inmediatamente, sino después de "llenar" el array local con una imagen, es decir, después de todos los cálculos de color y la inicialización del array de imágenes. Creo que este es el problema.

 

Para poder hacer una conclusión final, almacenaré la imagen en un array estático o global. En los eventos de interfaz, actualizaré la ventana inmediatamente enviando ResourceCreate()- sin inicializar el array local y llamando a ColorToARGB().

Si después de esto el efecto de ralentización desaparece - entonces el problema es el que he descrito. Si no es así, el problema está en otra cosa.

Mañana intentaré comprobarlo. Después de la experiencia, escribiré sobre los resultados.

 
 
o_O:
ejecutarlo con un perfilador.
Lo haré mañana. Bien. )
 

@Peter Konow, ¿por qué tantas palabras en inglés en el código?

Cambia al ruso puro:

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

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

@Peter Konow, ¿por qué tantas palabras en inglés en el código?

Cambia al ruso puro:

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


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

Eso es aún mejor.

 
Igor Volodin:

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


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

Eso es aún mejor.

siguiente - cambiar #define por '#define'

añadido: cambiar "pérdida" por "beneficio
etc...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
Enciéndelo bien y no será peor entonces, en mi opinión.
 
Andrey Khatimlianskii:

@Peter Konow, ¿por qué tantas palabras en inglés en el código?

Cambia al ruso puro:

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

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

La sugerencia es interesante, he pensado en ello. Sin embargo, combinar dos lenguas tiene sus ventajas.

Si un programa está escrito en un solo idioma (aunque sea el nativo), la vista se va "glosando" por la monotonía del texto.

La alternancia de nombres de funciones y variables en ruso y de identificadores en inglés para eventos, propiedades, constantes y operadores crea el contraste necesario para una mejor lectura.

Por lo tanto, no me paso completamente al ruso. Sin embargo, el ruso sigue dominando, y ayuda mucho a navegar en código grande.

 

así que con el inicio de la primera versión del trabajo de estilismo.

La implementación del esquema tiene el siguiente aspecto

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

esAttrName - lista (extensible) de atributos del elemento a renderizar

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

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


este atributo se almacena en una clase GAttr

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

se parece un poco a MqlParam, pero a diferencia de éste, es independiente del tipo.

------

entonces los atributos se agrupan en una lista GAttrReflect. Esta lista se referirá a un determinado estado de una determinada clase.

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

Una característica importante de esta clase es que un atributo no puede repetirse dos veces en m_list. Cuando se actualiza un atributo, se sobrescribe, o se crea un atributo si no existía.

-------

Cada control tiene varias listas de este tipo. Cada uno de ellos se refiere a un reflejo del estado de un control. Esta lista de reflexiones es ampliable.

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

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

En consecuencia, se pueden definir atributos para cada control (clase) para cada uno de sus reflejos.

Una clase - GAttrClass - almacena la lista de reflexiones de una clase particular.

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

-------

Y finalmente, la última clase, GThema, maneja todo el conjunto de clases que existen y son creadas por ti.

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

Esta clase utiliza el mismo principio que la lista de atributos: no pueden existir dos clases con el mismo nombre en la lista.

Gracias a la sobrecarga del operador[ ] podemos especificar cómodamente los nombres de los parámetros.

// задаём в классе 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);

---------

Y por último, así es como obtenemos el parámetro de interés de la materia de la clase

1. encontrar la m_class requerida en la lista
2. Si se encuentra, busque un reflejo en él,
3. si se encuentra, entonces buscamos el atributo
4. si no se encuentra ningún atributo, se busca un reflejo por defecto y un atributo en él
5. Si el atributo no se encuentra en el reflector por defecto, repita los pasos 1-4 para el nombre de la clase por defecto (m_class=NULL), que es común a todos los elementos.

---------
ventaja del enfoque:
- siempre hay una clase por defecto con la que se puede congeniar y no crear otras nuevas.
- puede utilizar sólo el arDefault por defecto en lugar de crear reflejos
- no tiene que especificar ninguna propiedad en cada control. Sólo tienes que añadir la clase a GThema y copiar
- todos los atributos que no fueron especificados en la clase en el reflector se obtienen jerárquicamente del reflector por defecto o de la clase por defecto.


Razón de la queja: