Fare un progetto in crowdsourcing su Canvas - pagina 17

 
o_O:

Create_resource(string Resource_name

Resource_name - quanto spesso cambia? quante risorse ci sono in memoria?

Letteralmente pochi. Dipende da quante finestre sono aperte. Attualmente sto lavorando con 1 o 2 finestre alla volta. Ogni finestra ha 3-4 oggetti bitmap. Risultano circa 8 risorse. (Penso che non sia abbastanza per rallentare...)

Aggiornamento di Windows sugli eventi dell'interfaccia (ora solo sui clic, altri eventi disabilitati). Allo stesso tempo, rallenta immediatamente, non dopo qualche tempo. Al primo clic. Inoltre, vedo chiaramente una connessione tra la "potenza di frenata" e la dimensione del finestrino. Più grande è la finestra, più lenta è la risposta dell'immagine.

E notate anche che ResourceCreate() arriva non immediatamente, ma dopo aver "riempito" l'array locale con un'immagine, cioè dopo tutti i calcoli del colore e l'inizializzazione dell'array di immagini. Credo che questo sia il problema.

 

Per concludere, memorizzerò l'immagine in un array statico o globale. Sugli eventi dell'interfaccia, aggiornerò immediatamente la finestra inviando a ResourceCreate()- senza inizializzare l'array locale e chiamare ColorToARGB().

Se dopo questo l'effetto di rallentamento scompare - allora il problema è quello che ho descritto. Se no - allora il problema è in qualcos'altro.

Domani cercherò di controllare. Dopo l'esperienza scriverò dei risultati.

 
eseguito con un profiler.
 
o_O:
eseguirlo con un profiler.
Lo farò domani. Ok. )
 

@Peter Konow, perché così tante parole inglesi nel codice?

Passa al russo puro:

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

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

@Peter Konow, perché così tante parole inglesi nel codice?

Passa al russo puro:

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


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

Questo è ancora meglio.

 
Igor Volodin:

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


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

Questo è ancora meglio.

dopo - cambiare #define in '#define'

aggiunto: cambia "perdita" in "profitto
ecc...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
Accendilo correttamente e allora non sarà peggio, secondo me.
 
Andrey Khatimlianskii:

@Peter Konow, perché così tante parole inglesi nel codice?

Passa al russo puro:

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

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

Il suggerimento è interessante, ci ho pensato. Tuttavia, ci sono dei vantaggi nel combinare due lingue.

Se un programma è scritto in una sola lingua (anche se è la lingua madre), la vista viene gradualmente "sorvolata" dalla monotonia del testo.

L'alternanza di nomi russi di funzioni e variabili, e di identificatori inglesi per eventi, proprietà, costanti e operatori, crea il contrasto necessario per una migliore lettura.

Pertanto, non passo completamente al russo. Tuttavia, il russo domina ancora, e aiuta molto a navigare in grandi codici.

 

così con l'inizio della prima versione del lavoro di styling.

L'implementazione dello schema appare così

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

enAttrName - lista (estensibile) di attributi dell'elemento da rendere

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

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


questo attributo è memorizzato in una classe GAttr

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

assomiglia un po' a MqlParam, ma a differenza di esso, è indipendente dai tipi.

------

allora gli attributi sono raggruppati in una lista GAttrReflect. Questa lista si riferisce a un certo stato di una certa classe.

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

Una caratteristica importante di questa classe è che un attributo non può essere ripetuto due volte in m_list. Quando si aggiorna un attributo, esso verrà sovrascritto, o verrà creato un attributo se non esisteva.

-------

Ogni controllo ha diverse liste di questo tipo. Ognuno di essi si riferisce a un riflesso dello stato di un controllo. Questa lista di riflessioni è espandibile.

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

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

Di conseguenza, si possono definire attributi per ogni controllo (classe) per ciascuno dei suoi riflessi.

Una classe - GAttrClass - memorizza la lista di riflessione di una particolare classe.

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

-------

E infine, la classe finale, GThema, gestisce l'intero insieme di classi che esistono e sono create da voi.

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

Questa classe usa lo stesso principio della lista di attributi - non possono esistere due classi con lo stesso nome nella lista.

Grazie all'overloading operator[] possiamo specificare comodamente i nomi dei parametri.

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

---------

E infine, ecco come otteniamo il parametro di interesse dal soggetto della classe

1. trovare la m_class richiesta nell'elenco
2. Se si trova, cercate un riflesso in esso,
3. se viene trovato, allora cerchiamo l'attributo
4. se non si trova nessun attributo, allora cerchiamo un riflesso predefinito e un attributo in esso
5. Se l'attributo non si trova nel riflettore predefinito, ripetere i passi 1-4 per il nome della classe predefinita (m_class=NULL), che è comune a tutti gli elementi.

---------
vantaggio dell'approccio:
- c'è sempre una classe predefinita con cui si può andare d'accordo e non crearne di nuove.
- potete usare solo l'arDefault di default invece di creare riflessi
- non devi specificare nessuna proprietà in ogni controllo. Hai solo bisogno di aggiungere la classe a GThema e recuperare i dati da essa
- tutti gli attributi che non sono stati specificati nella classe nel riflettore sono ottenuti gerarchicamente dal riflettore predefinito o dalla classe predefinita.