Realización de un proyecto crowdsourced en Canvas - página 17
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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.
ejecutarlo con un perfilador.
@Peter Konow, ¿por qué tantas palabras en inglés en el código?
Cambia al ruso puro:
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
@Peter Konow, ¿por qué tantas palabras en inglés en el código?
Cambia al ruso puro:
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Eso es aún mejor.
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Eso es aún mejor.
añadido: cambiar "pérdida" por "beneficio
etc...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0; // сокращение от номер.
пока( нмр < 10 )
{
вывод( "номер = ", нмр, "!" );
нмр ++;
}
}@Peter Konow, ¿por qué tantas palabras en inglés en el código?
Cambia al ruso puro:
#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 // возможные аттрибутов контрола
{
// шрифт
anFontName, // имя
anFontColor, // цвет
anFontSize, // размер
anFontWeight, // толщина
anFontStyle, // стиль
// фон
anBackgroundColor, // цвет
anBackgroundFill, // заливка
// граница
anBorderColor, // цвет
anBorderWidth, // толщина
// выравнивание
anAlign,
anVAlign
по мере необходимости добавлять нужные аттрибуты
};
este atributo se almacena en una clase 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.
{
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.
{
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.
{
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.
{
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.
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.