Fazendo um projeto de crowdsourced em Tela - página 17

 
o_O:

Create_resource(string Resource_name

Resource_name - quantas vezes ele muda? quantos recursos estão na memória?

Literalmente alguns. Depende de quantas janelas estiverem abertas. Atualmente estou trabalhando com 1 ou 2 janelas de cada vez. Cada janela tem 3-4 objetos de bitmap. Acontece que são cerca de 8 recursos. (acho que não basta abrandar...)

Atualização do Windows em eventos de interface (agora apenas em cliques, outros eventos desativados). Ao mesmo tempo, ele desacelera imediatamente, não depois de algum tempo. No primeiro clique. Além disso, posso ver claramente uma conexão entre a "potência de frenagem" e o tamanho da janela. Quanto maior a janela, mais lenta é a resposta da imagem.

E também note que ResourceCreate() não chega imediatamente, mas após "preencher" a matriz local com uma imagem, ou seja, após todos os cálculos de cores e inicialização da matriz de imagens. Eu acho que este é o problema.

 

A fim de chegar a uma conclusão final, vou armazenar a imagem em uma matriz estática ou global. Em eventos de interface, vou atualizar a janela imediatamente enviando ResourceCreate()- sem inicializar a matriz local e chamando ColorToARGB().

Se depois disso o efeito de desaceleração desaparecer - então o problema é o que eu descrevi. Se não - então o problema está em outra coisa.

Amanhã vou tentar verificar isso. Após a experiência, escreverei sobre os resultados.

 
rodar com um profiler.
 
o_O:
rodá-lo com um perfilador.
Farei isso amanhã. Ok. )
 

@Peter Konow, por que tantas palavras em inglês no código?

Mudar para russo puro:

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

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

@Peter Konow, por que tantas palavras em inglês no código?

Mudar para russo puro:

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


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

Isso é ainda melhor.

 
Igor Volodin:

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


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

Isso é ainda melhor.

seguinte - mudar #define para '#define'.

acrescentou: mudar 'perda' para 'lucro'.
etc....
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
Acenda-a corretamente e não será pior então, na minha opinião.
 
Andrey Khatimlianskii:

@Peter Konow, por que tantas palavras em inglês no código?

Mudar para russo puro:

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

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

A sugestão é interessante, eu pensei sobre isso. No entanto, há vantagens em combinar dois idiomas.

Se um programa é escrito em apenas um idioma (mesmo se for o idioma nativo), a visão é gradualmente "encoberta" pela monotonia do texto.

A alternância da função russa e dos nomes de variáveis, e dos identificadores em inglês para eventos, propriedades, constantes e operadores, cria o contraste necessário para uma melhor leitura.

Portanto, eu não mudo completamente para o russo. Entretanto, o russo ainda domina, e ajuda muito a navegar em código grande.

 

Assim, com o início da primeira versão do trabalho de styling.

A implementação do esquema tem este aspecto

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

enAttrName - lista (expansível) de atributos do elemento a ser renderizado

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

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


este atributo é armazenado em uma classe GAttr

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

assemelha-se um pouco ao MqlParam, mas, ao contrário dele, é dependente da digitação.

------

então os atributos são agrupados em uma lista GAttrReflect. Esta lista se referirá a um determinado estado de uma determinada classe.

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

Uma característica importante desta classe é que um atributo não pode ser repetido duas vezes na m_list. Ao atualizar um atributo, ele será sobrescrito, ou um atributo será criado se ele não existir.

-------

Cada controle tem várias listas desse tipo. Cada um deles se refere a um reflexo do estado de um controle. Esta lista de reflexões é expansível.

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

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

Assim, é possível definir atributos para cada controle (classe) para cada um de seus reflexos.

Uma classe - GAttrClass - armazena a lista de reflexão de uma classe em particular.

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

-------

E finalmente, a classe final, GThema, trata de todo o conjunto de classes que existem e são criadas por você.

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

Esta classe usa o mesmo princípio da lista de atributos - não podem existir duas classes com o mesmo nome na lista.

Graças à sobrecarga do operador[], podemos especificar convenientemente os nomes dos 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);

---------

E finalmente, aqui está como obtemos o parâmetro de interesse do assunto da classe

1. Encontre a classe m_classe requerida na lista
2. Se for encontrado, procure por um reflexo nele,
3. Se for encontrado, então procuramos o atributo
4. Se nenhum atributo for encontrado, então procuramos um reflexo padrão e um atributo nele
Se o atributo não for encontrado no refletor padrão, repita os passos 1-4 para o nome da classe padrão (m_class=NULL), que é comum a todos os elementos.

---------
vantagem da abordagem:
- há sempre uma classe padrão com a qual você pode se dar bem e não criar novas classes.
- você pode usar apenas o padrão arDefault em vez de criar reflexos
- você não precisa especificar nenhuma propriedade em cada controle. Você só precisa adicionar a classe à GThema e copiar
- todos os atributos que não foram especificados na classe no refletor são obtidos hierarquicamente a partir do refletor padrão ou da classe padrão.


Razão: