Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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 ausführen.
@Peter Konow, warum so viele englische Wörter in dem Code?
Wechseln Sie zu reinem Russisch:
#define пока while
#define Печатать Print
void OnStart()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
@Peter Konow, warum so viele englische Wörter in dem Code?
Wechseln Sie zu reinem Russisch:
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Das ist sogar noch besser.
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0;
пока ( номер < 10 )
{
Печатать( "номер = ", номер, "!" );
номер ++;
}
}
Das ist sogar noch besser.
hinzugefügt: Verlust" in "Gewinn" ändern
usw...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0; // сокращение от номер.
пока( нмр < 10 )
{
вывод( "номер = ", нмр, "!" );
нмр ++;
}
}@Peter Konow, warum so viele englische Wörter in dem Code?
Wechseln Sie zu reinem Russisch:
#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 // возможные аттрибутов контрола
{
// шрифт
anFontName, // имя
anFontColor, // цвет
anFontSize, // размер
anFontWeight, // толщина
anFontStyle, // стиль
// фон
anBackgroundColor, // цвет
anBackgroundFill, // заливка
// граница
anBorderColor, // цвет
anBorderWidth, // толщина
// выравнивание
anAlign,
anVAlign
по мере необходимости добавлять нужные аттрибуты
};
dieses Attribut wird in einer GAttr-Klasse gespeichert
{
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.
{
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.
{
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.
{
string m_class; // для какого класса составлен список
GAttrReflect reflect[arLast]; // список рефлектов класса
};
-------
Die letzte Klasse schließlich, GThema, verwaltet alle vorhandenen und von Ihnen erstellten Klassen.
{
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.
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.