Ein Crowdsourced-Projekt auf Canvas durchführen - Seite 17

 
o_O:

Create_resource(string Ressourcen_name

Ressourcenname - wie oft ändert er sich? wie viele Ressourcen befinden sich im Speicher?

Buchstäblich ein paar. Hängt davon ab, wie viele Fenster geöffnet sind. Derzeit arbeite ich mit jeweils 1 oder 2 Fenstern. Jedes Fenster hat 3-4 Bitmap-Objekte. Es werden etwa 8 Ressourcen benötigt. (Ich denke, es ist nicht genug, um langsamer zu werden...)

Windows-Update bei Schnittstellenereignissen (jetzt nur bei Klicks, andere Ereignisse deaktiviert). Gleichzeitig verlangsamt er sich sofort und nicht erst nach einiger Zeit. Beim ersten Klick. Außerdem kann ich einen klaren Zusammenhang zwischen der "Bremsleistung" und der Fenstergröße erkennen. Je größer das Fenster ist, desto langsamer ist die Reaktion des Bildes.

Und beachten Sie auch, dass ResourceCreate() nicht sofort, sondern erst nach dem "Füllen" des lokalen Arrays mit einem Bild kommt, d.h. nach allen Farbberechnungen und der Initialisierung des Bild-Arrays. Ich glaube, das ist das Problem.

 

Um eine endgültige Schlussfolgerung ziehen zu können, werde ich das Bild in einem statischen oder globalen Array speichern. Bei Schnittstellenereignissen aktualisiere ich das Fenster sofort, indem ich ResourceCreate() sende - ohne das lokale Array zu initialisieren und ColorToARGB() aufzurufen.

Wenn danach der Verlangsamungseffekt verschwindet, liegt das Problem in der von mir beschriebenen Weise. Wenn nicht, dann liegt das Problem an etwas anderem.

Morgen werde ich versuchen, das zu überprüfen. Nach der Erfahrung werde ich über die Ergebnisse schreiben.

 
mit einem Profiler ausgeführt werden.
 
o_O:
mit einem Profiler ausführen.
Ich werde es morgen tun. Gut. )
 

@Peter Konow, warum so viele englische Wörter in dem Code?

Wechseln Sie zu reinem Russisch:

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

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

@Peter Konow, warum so viele englische Wörter in dem Code?

Wechseln Sie zu reinem Russisch:

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


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

Das ist sogar noch besser.

 
Igor Volodin:

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


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

Das ist sogar noch besser.

next - #define in '#define' ändern

hinzugefügt: Verlust" in "Gewinn" ändern
usw...
 
#define цл    int     // целое
#define цлк   short   // целое короткое
#define цлд   long    // целое длинное
#define плк   float   // плавающее короткое
#define пл    double  // плавающее
#define пст   void    // пустота
#define исток main
#define вывод Print
#define пока  while

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

   }

}
Wenn man es richtig anzündet, wird es meiner Meinung nach nicht schlechter sein.
 
Andrey Khatimlianskii:

@Peter Konow, warum so viele englische Wörter in dem Code?

Wechseln Sie zu reinem Russisch:

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

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

Der Vorschlag ist interessant, ich habe darüber nachgedacht. Es hat jedoch Vorteile, zwei Sprachen zu kombinieren.

Wenn ein Programm nur in einer Sprache geschrieben ist (selbst wenn es die Muttersprache ist), wird die Ansicht durch die Monotonie des Textes allmählich "beschönigt".

Der Wechsel zwischen russischen Funktions- und Variablennamen und englischen Bezeichnungen für Ereignisse, Eigenschaften, Konstanten und Operatoren schafft den notwendigen Kontrast für eine bessere Lesbarkeit.

Deshalb wechsle ich nicht vollständig zu Russisch. Allerdings dominiert Russisch immer noch, und es hilft sehr, sich in großen Codes zurechtzufinden.

 

so mit dem Beginn der ersten Version von Stylingarbeiten.

Die Implementierung des Schemas sieht wie folgt aus

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

enAttrName - Liste (erweiterbar) der Attribute des darzustellenden Elements

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

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


dieses Attribut wird in einer GAttr-Klasse gespeichert

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

ähnelt MqlParam etwas, ist aber im Gegensatz zu diesem typunabhängig.

------

dann werden die Attribute in einer GAttrReflect-Liste gruppiert. Diese Liste wird sich auf einen bestimmten Zustand einer bestimmten Klasse beziehen.

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

Ein wichtiges Merkmal dieser Klasse ist, dass ein Attribut nicht zweimal in m_list vorkommen kann. Wenn Sie ein Attribut aktualisieren, wird es überschrieben, oder es wird ein Attribut erstellt, wenn es noch nicht vorhanden war.

-------

Jede Kontrolle hat mehrere solcher Listen. Jedes von ihnen bezieht sich auf eine Spiegelung des Zustands eines Steuerelements. Diese Liste von Überlegungen ist erweiterbar.

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

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

Dementsprechend kann man für jedes Steuerelement (Klasse) Attribute für jeden seiner Reflexe definieren.

Eine Klasse - GAttrClass - speichert die Reflexionsliste einer bestimmten Klasse.

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

-------

Die letzte Klasse schließlich, GThema, verwaltet alle vorhandenen und von Ihnen erstellten Klassen.

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

Für diese Klasse gilt dasselbe Prinzip wie für die Attributliste - es können keine zwei Klassen mit demselben Namen in der Liste existieren.

Dank der Überladung mit operator[] können wir bequem Parameternamen angeben.

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

---------

Und schließlich, wie wir den Parameter von Interesse aus der Klasse subject erhalten

1. Suchen Sie die gewünschte m_class in der Liste
2. Wenn sie gefunden wird, suchen Sie darin nach einem Reflex,
3. Wenn es gefunden wird, suchen wir nach dem Attribut
4. Wenn kein Attribut gefunden wird, suchen wir nach einem Standardreflex und einem Attribut darin.
5 Wird das Attribut nicht im Standardreflektor gefunden, wiederholen Sie die Schritte 1-4 für den Standardklassennamen (m_class=NULL), der allen Elementen gemeinsam ist.

---------
Vorteil des Ansatzes:
- Es gibt immer eine Standardklasse, mit der man auskommen kann, ohne neue zu schaffen.
- Sie können nur den Standard arDefault verwenden, anstatt Reflexe zu erstellen
- müssen Sie keine Eigenschaften in jedem Steuerelement angeben. Sie müssen nur die Klasse zu GThema hinzufügen und die Daten daraus abrufen
- werden alle Attribute, die nicht in der Klasse im Reflektor angegeben wurden, hierarchisch aus dem Standardreflektor oder der Standardklasse bezogen.


Grund der Beschwerde: