Resource_name - 얼마나 자주 변경됩니까? 메모리에 얼마나 많은 리소스가 있습니까?
말 그대로 몇 개. 열려 있는 창의 수에 따라 다릅니다. 현재 저는 1-2개의 창을 동시에 작업합니다. 각 창에는 3 - 4개의 비트맵 개체가 있습니다. 어딘가에 8 자원이 있습니다. (속도를 늦추는 것만으로는 부족하다고 생각합니다...)
Windows는 인터페이스 이벤트에서 업데이트됩니다(이제 클릭 시에만, 다른 이벤트는 비활성화됨). 동시에 잠시 후가 아니라 즉시 속도가 느려집니다. 첫 번째 클릭 시. 또한 "제동력"과 창 크기 사이의 관계를 명확하게 볼 수 있습니다. 창이 클수록 사진의 반응이 느려집니다.
동시에 ResourceCreate() 가 즉시 도달하지 않고 로컬 배열을 이미지로 "채운" 후, 즉 모든 색상 계산 및 이미지 배열 초기화 후에 도달한다는 점을 고려해야 합니다. 그게 문제인 것 같아요.
//------------------------------------------------------------------ enum enAttrName enum enAttrName // возможные аттрибутов контрола { // шрифт anFontName, // имя anFontColor, // цвет anFontSize, // размер anFontWeight, // толщина anFontStyle, // стиль // фон anBackgroundColor, // цвет anBackgroundFill, // заливка // граница anBorderColor, // цвет anBorderWidth, // толщина // выравнивание anAlign, anVAlign
по мере необходимости добавлять нужные аттрибуты };
속성은 GAttr 클래스에 저장됩니다.
class GAttr // класс для установки значения в конкретный аттрибут { enAttrName m_attr; // имя аттрибута // его значение long lval; double dval; string sval; };
속성은 GAttrReflect 목록으로 추가로 그룹화됩니다. 이 목록은 특정 클래스의 특정 상태를 나타냅니다.
class GAttrReflect { GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния };
이 클래스의 작업의 중요한 특징은 m_list 목록에서 특정 속성이 두 번 반복될 수 없다는 것입니다. 속성 값은 업데이트 중에 덮어쓰여지거나 속성이 존재하지 않는 경우 생성됩니다.
-------
각 컨트롤에는 이러한 목록이 여러 개 있습니다. 각각은 컨트롤 상태의 반영을 나타냅니다. 이 반사(반사) 목록 은 확장 가능 합니다.
enum enAttrReflect // виды состояний - реакция контрола на своё состояние { arDefault, // состояние по-умолчанию arDisable, // недоступен для ввода/неактивный arTransp, // должен стать прозрачным arSelect, // выбран arCheck, // отмечен arOver, // мышка над объектом arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты };
따라서 각 컨트롤(클래스)은 각 리플렉션에 대해 정의된 속성을 가질 수 있습니다.
클래스 - GAttrClass - 특정 클래스의 반영 목록을 저장합니다.
class GAttrClass { string m_class; // для какого класса составлен список GAttrReflect reflect[arLast]; // список рефлектов класса };
-------
그리고 마지막으로 존재하는 전체 클래스 세트 를 처리하는 최종 클래스 GThema 입니다.
class GThema { GAttrClass* m_list[]; // список классов };
이 클래스에서는 속성 목록과 유사한 원칙이 적용됩니다. 동일한 이름을 가진 두 클래스는 목록에 존재할 수 없습니다.
operator[] 오버로드 덕분에 매개변수 이름을 편리하게 지정할 수 있습니다.
// задаём в классе 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 );
----------
마지막으로 클래스 주제에서 관심 매개변수를 얻는 방법
1. 목록에서 필요한 클래스 m_class를 찾습니다. 2. 발견되면 그 안에 반영을 찾습니다. 3. 발견되면 속성을 찾고 있습니다. 4. 속성을 찾을 수 없으면 기본 반사와 속성을 찾습니다. 5. 속성이 기본 리플렉션에 없으면 모든 요소에 공통적인 기본 클래스 이름(m_class=NULL)에 대해 1-4단계를 반복합니다.
---------- 접근 이점: - 원칙적으로 생략할 수 있고 새로운 클래스를 생성할 수 없는 기본 클래스가 항상 있습니다. - 반사를 생성할 수 없으며 기본 arDefault만 사용합니다. - 각 컨트롤에서 속성을 설정할 필요가 없습니다. GThema에 클래스를 추가하고 데이터를 가져오는 것으로 충분합니다. - 반사에서 클래스에 대해 설정되지 않은 모든 속성은 기본 반사 또는 기본 클래스에서 계층적으로 가져옵니다.
Create_resource (문자열 Resource_name
Resource_name - 얼마나 자주 변경됩니까? 메모리에 얼마나 많은 리소스가 있습니까?
말 그대로 몇 개. 열려 있는 창의 수에 따라 다릅니다. 현재 저는 1-2개의 창을 동시에 작업합니다. 각 창에는 3 - 4개의 비트맵 개체가 있습니다. 어딘가에 8 자원이 있습니다. (속도를 늦추는 것만으로는 부족하다고 생각합니다...)
Windows는 인터페이스 이벤트에서 업데이트됩니다(이제 클릭 시에만, 다른 이벤트는 비활성화됨). 동시에 잠시 후가 아니라 즉시 속도가 느려집니다. 첫 번째 클릭 시. 또한 "제동력"과 창 크기 사이의 관계를 명확하게 볼 수 있습니다. 창이 클수록 사진의 반응이 느려집니다.
동시에 ResourceCreate() 가 즉시 도달하지 않고 로컬 배열을 이미지로 "채운" 후, 즉 모든 색상 계산 및 이미지 배열 초기화 후에 도달한다는 점을 고려해야 합니다. 그게 문제인 것 같아요.
최종 결론을 내리기 위해 이미지를 정적 또는 전역 배열에 저장합니다. 인터페이스 이벤트에서 로컬 배열을 초기화하고 ColorToARGB()를 호출하지 않고 창을 ResourceCreate() 로 전송하여 즉시 창을 업데이트합니다.
이 후 제동 효과가 사라지면 요점은 내가 말한 것입니다. 그렇지 않다면 문제는 다른 데 있습니다 ...
나는 이것을 내일 확인하려고 노력할 것이다. 체험 후 결과를 포스팅하겠습니다.
프로파일러로 실행합니다.
@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?
순수 러시아어로 전환:
#define пока while
#define Печатать Print
void OnStart ()
{
целочисленное номер = 0 ;
пока ( номер < 10 )
{
Печатать( "номер = " , номер, "!" );
номер ++;
}
}
@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?
순수 러시아어로 전환:
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0 ;
пока ( номер < 10 )
{
Печатать( "номер = " , номер, "!" );
номер ++;
}
}
그래서 더 좋은
#define пустой void
#define пока while
#define Печатать Print
#define Начнем OnStart
пустой Начнем()
{
целочисленное номер = 0 ;
пока ( номер < 10 )
{
Печатать( "номер = " , номер, "!" );
номер ++;
}
}
그래서 더 좋은
추가: '손실'을 '이익'으로 변경
등...
#define цлк short // целое короткое
#define цлд long // целое длинное
#define плк float // плавающее короткое
#define пл double // плавающее
#define пст void // пустота
#define исток main
#define вывод Print
#define пока while
пст исток()
{
цл нмр = 0 ; // сокращение от номер.
пока ( нмр < 10 )
{
вывод( "номер = " , нмр, "!" );
нмр ++;
}
}@Peter Konow , 코드에 왜 그렇게 많은 영어 단어가 있습니까?
순수 러시아어로 전환:
#define пока while
#define Печатать Print
void OnStart ()
{
целочисленное номер = 0 ;
пока ( номер < 10 )
{
Печатать( "номер = " , номер, "!" );
номер ++;
}
}
흥미로운 제안, 그것에 대해 생각했습니다. 그러나 두 언어를 결합하면 이점이 있습니다.
프로그램이 한 가지 언어로만 작성된 경우(모국어일지라도) 텍스트의 단조로움으로 인해 보기가 점차 "흐려집니다".
함수 및 변수의 러시아어 이름과 이벤트, 속성, 상수 및 연산자의 영어 식별자를 번갈아 사용하면 더 나은 읽기에 필요한 대비가 생성됩니다.
따라서 러시아어로 완전히 전환하지 않습니다. 그러나 러시아어가 여전히 지배적이며 이는 큰 코드를 탐색하는 데 많은 도움이 됩니다.
스타일 작업의 첫 번째 버전의 주도로.
스키마 구현은 다음과 같습니다.
**************
enAttrName - 렌더링된 요소의 속성 목록(확장 가능)
enum enAttrName // возможные аттрибутов контрола
{
// шрифт
anFontName, // имя
anFontColor, // цвет
anFontSize, // размер
anFontWeight, // толщина
anFontStyle, // стиль
// фон
anBackgroundColor, // цвет
anBackgroundFill, // заливка
// граница
anBorderColor, // цвет
anBorderWidth, // толщина
// выравнивание
anAlign,
anVAlign
по мере необходимости добавлять нужные аттрибуты
};
속성은 GAttr 클래스에 저장됩니다.
{
enAttrName m_attr; // имя аттрибута
// его значение
long lval;
double dval;
string sval;
};
MqlParam 과 다소 유사하지만 이와는 달리 유형 독립적입니다.
------
속성은 GAttrReflect 목록으로 추가로 그룹화됩니다. 이 목록은 특정 클래스의 특정 상태를 나타냅니다.
{
GAttr* m_list[]; // список аттрибутов класса для одного некоторого состояния
};
이 클래스의 작업의 중요한 특징은 m_list 목록에서 특정 속성이 두 번 반복될 수 없다는 것입니다. 속성 값은 업데이트 중에 덮어쓰여지거나 속성이 존재하지 않는 경우 생성됩니다.
-------
각 컨트롤에는 이러한 목록이 여러 개 있습니다. 각각은 컨트롤 상태의 반영을 나타냅니다. 이 반사(반사) 목록 은 확장 가능 합니다.
{
arDefault, // состояние по-умолчанию
arDisable, // недоступен для ввода/неактивный
arTransp, // должен стать прозрачным
arSelect, // выбран
arCheck, // отмечен
arOver, // мышка над объектом
arFocus, // получен фокус ввода
по мере необходимости добавлять новые рефлекты
};
따라서 각 컨트롤(클래스)은 각 리플렉션에 대해 정의된 속성을 가질 수 있습니다.
클래스 - GAttrClass - 특정 클래스의 반영 목록을 저장합니다.
{
string m_class; // для какого класса составлен список
GAttrReflect reflect[arLast]; // список рефлектов класса
};
-------
그리고 마지막으로 존재하는 전체 클래스 세트 를 처리하는 최종 클래스 GThema 입니다.
{
GAttrClass* m_list[]; // список классов
};
이 클래스에서는 속성 목록과 유사한 원칙이 적용됩니다. 동일한 이름을 가진 두 클래스는 목록에 존재할 수 없습니다.
operator[] 오버로드 덕분에 매개변수 이름을 편리하게 지정할 수 있습니다.
g_thema[ "GButton" ][arOver][anFontColor]=XRGB( 255 , 255 , 255 );
// или можно так
GAttrClass* at = g_thema[ "GButton" ];
GAttrReflect* vl = at[arDefault];
vl[anFontColor] = XRGB( 255 , 255 , 255 );
----------
마지막으로 클래스 주제에서 관심 매개변수를 얻는 방법
1. 목록에서 필요한 클래스 m_class를 찾습니다.
2. 발견되면 그 안에 반영을 찾습니다.
3. 발견되면 속성을 찾고 있습니다.
4. 속성을 찾을 수 없으면 기본 반사와 속성을 찾습니다.
5. 속성이 기본 리플렉션에 없으면 모든 요소에 공통적인 기본 클래스 이름(m_class=NULL)에 대해 1-4단계를 반복합니다.
----------
접근 이점:
- 원칙적으로 생략할 수 있고 새로운 클래스를 생성할 수 없는 기본 클래스가 항상 있습니다.
- 반사를 생성할 수 없으며 기본 arDefault만 사용합니다.
- 각 컨트롤에서 속성을 설정할 필요가 없습니다. GThema에 클래스를 추가하고 데이터를 가져오는 것으로 충분합니다.
- 반사에서 클래스에 대해 설정되지 않은 모든 속성은 기본 반사 또는 기본 클래스에서 계층적으로 가져옵니다.