객체를 동적으로 생성하는 방법은 무엇입니까? (일부 OOP 물건) - 페이지 5

 
도르크 힐거 :

2. 처음부터 프레임워크.

여기 비슷합니다. 표준 라이브러리에 대해 조금 더 깊이 들어가기 시작했을 때 나는 마음에 들지 않는 많은 것들을 발견했습니다. 그것들의 나쁜 성능뿐만 아니라 유연성 부족과 불완전한 아키텍처 때문입니다. 예를 들어 전역 CMouse 클래스/개체와 CWnd와 CObject 사이의 클래스가 누락되었습니다. CWnd 개체는 차트와 선의 자식이고 그러한 개체에 대한 연결이 없고 그러한 개체의 최종 구현이 없기 때문입니다. 내가 위에서 설명한 것처럼 전혀. 그리고 하나의 명령으로 모든 차트 개체를 표시/숨길 수 있는 모든 차트 개체를 보유하고 있는 마스터 개체가 없습니다. CCanvas, 같은 것, 좋은 클래스이지만 CWnd에서 상속된 비트맵을 기반으로 대화형 개체를 만들 수 있는 CWnd를 사용한 구현은 어디에 있습니까? 등등.




글로벌 CMouse의 역할은 무엇입니까? 마우스 관리에 쉽게 액세스할 수 있도록 최종 사용자에게 독립형 클래스로만 서비스를 제공합니까? 프레임워크와 어떤 관련이 있습니까?
CWnd와 CObject 사이의 클래스에 대해, 나는 당신이 왜 그것들이 필요하다고 생각했는지에 대한 당신의 설명을 따르지 않습니다. CWnd 개체는 차트와 선의 자식입니다. 문제가 발생하지 않는데 연결이 없는 이유는 무엇입니까?
당신은 또한 위에서 설명한 것과 같은 그러한 객체의 최종 구현이 전혀 없다고 말합니까? (어디서 설명하셨나요?)

 

전역 마우스 개체의 기회는 최소한 내 GUI에서 Auch 정보를 다루는 모든 클래스에서 액세스할 수 있는 마우스에 대한 모든 정보(위치, 누름 위치, 위치 가격 등)를 저장하는 것입니다. 또한 마우스 개체는 예를 들어 드래그할 때 마우스의 독점적 사용에 대한 정보를 보유합니다. 이것은 무언가를 끌거나 클릭하려고 하는 동안 많은 CPU 시간을 절약합니다.

마지막으로 중요한 것은 마우스 이벤트가 없기 때문에 EA에서 사용할 때 표준 라이브러리 의 어떤 것도 전략 테스터에서 작동하지 않습니다. 그리고 전략 테스터에서 마우스 지원을 구현하려는 경우 이러한 마우스 클래스에도 감사할 것입니다. 클래스는 마우스 움직임에 대한 정보가 어디에서 왔는지 상관하지 않지만 정보가 필요한 개체는 여전히 위치를 알고 있기 때문입니다. 찾아봐야 합니다.

---

내가 누락된 CWnd와 CObject 사이의 클래스일 뿐만 아니라 실제로는 픽셀 기반 개체와 시간/가격 기반 개체를 보유하는 마스터 개체/컨테이너가 더 많이 누락되었습니다. 당신도 언급했듯이 그것들은 모두 차트의 개체이므로 논리적 마스터는 차트를 나타내고 모든 개체를 보유하는 개체여야 합니다. 그리고 이를 실현하기 위해서는 CWnd와 CObject 사이에 클래스가 있어야 합니다.

이 아이디어의 배경은 논리뿐만 아니라 성능의 문제이기도 합니다. 제 경우에는 차트가 어떻게든 변경되면 마스터 개체가 이를 감지하고 선의 컨테이너, CWnd의 컨테이너 및 이러한 유형의 단일 개체가 될 수 있는 포함된 모든 개체를 반복하고 다음과 같은 모든 개체에 "알립니다" 이를 알리고자 합니다. 즉, 코드의 정확히 한 지점에 하나의 단일 루프가 있으며 컨테이너 및 하위 컨테이너와 함께 사용하기 때문에 매우 효율적입니다.

또한 이 마스터를 사용하여 한 번에 모든 개체를 고정하고 단 한 줄의 코드로 물리적 업데이트를 방지합니다. 성능차이가 확 납니다. 예: EA에 필요한 모든 시각적 개체를 생성하고 어떤 경우에는 논문이 1000개 이상인 경우 이 마스터 개체를 미리 고정하고 다른 개체를 만든 다음 나중에 "해동"하여 물리적 업데이트를 한 번 만듭니다. 차트. 정지하지 않으면 이 프로세스는 1분 정도 걸릴 수 있습니다. 동결 상태에서는 2초 미만입니다.

GUI를 직접 만들기 시작하기 전에 표준 라이브러리로 실제로 사용해 보았습니다. 나중에, 나는 적어도 일부를 유지하려고 노력했습니다. 그러나 문제는 불완전한 구현과 일종의 ... LetsMakeSomethingThatWorksSomehowForWeDontKnow와 같은 아키텍처로 인해 내가 염두에 두었던 것을 실현하는 것이 불가능했다는 것입니다. 시각적 성능은 명확한 계층 구조로 달성되지만 표준 라이브러리는 어떻게 든 무정부적입니다.

어쨌든, 나는 이것을 처음으로 인식한 사람이 아닙니다. 그리고 Alain이 이미 언급했듯이 너무 이론적인 것이기 때문에 이것이 정말로 도움이 되는지 확신할 수 없습니다. MQL을 기반으로 한 것이 아니라 이 모든 것에 대한 내 경험에 대해 이야기할 수 있지만, 내 의견은 내 의견일 뿐이며 물론 법률은 아닙니다.

 
첫째, 너무 이론적이라는 데 동의하지 않습니다. 매우 통찰력이 있다고 생각합니다. 프레임워크 구축에 관심이 없고 인터페이스 패널을 구축하기 위해 프레임워크를 사용해야 하는 사람들을 위한 이론이라는 데 동의할 수 있습니다.

그러나 두 번째 유형의 경우 여기서 논의되는 사고 방식과 고려 사항도 매우 가치 있고 매우 실용적입니다. 물론 기사가 더 낫겠지만, 그럼에도 불구하고.
나는 사람들이 이 스레드를 읽은 후에 프레임워크를 구축할 것이라고 생각하지 않지만, 이미 공개 MQL 프레임워크를 구축한 사람들에게도 부족한 것처럼 보이는 좋은 정보와 통찰력을 여전히 가지고 있습니다.

따라서 마우스와 테스터의 경우 내가 당신을 따라간다면 ::OnTester()를 사용하여 사용자 입력 대신 마우스를 호출합니다.

다시 한 번 감사합니다, Doerk.
 
Doerk Hilger :

전역 마우스 개체의 기회는 최소한 내 GUI에서 Auch 정보를 다루는 모든 클래스에서 액세스할 수 있는 마우스에 대한 모든 정보(위치, 누름 위치, 위치 가격 등)를 저장하는 것입니다. 또한 마우스 개체는 예를 들어 드래그할 때 마우스의 독점적 사용에 대한 정보를 보유합니다. 이것은 무언가를 끌거나 클릭하려고 하는 동안 많은 CPU 시간을 절약합니다.

마지막으로 중요한 것은 마우스 이벤트가 없기 때문에 EA에서 사용할 때 표준 라이브러리 의 어떤 것도 전략 테스터에서 작동하지 않습니다. 전략 테스터에서 마우스 지원을 구현하려는 경우 이러한 마우스 클래스에도 감사할 것입니다. 클래스는 마우스 움직임에 대한 정보가 어디에서 왔는지 상관하지 않지만 정보가 필요한 객체는 여전히 위치를 알고 있기 때문입니다. 찾아봐야 합니다.

글로벌 마우스가 이제 객체 클릭을 감지했다고 가정합니다. 설명에서 객체 자체는 마우스 클래스에서 해당 정보를 찾아야 합니다. 마우스가 객체에 이벤트를 이동하여 알릴 필요가 없습니다 물체? 그렇다면 CPU 시간은 어디에 저장됩니까? 그렇지 않은 경우 개체가 마우스 이벤트를 놓치지 않는 이유 콤보 상자로. 따라서 마우스가 개체를 클릭한 이벤트를 전달해야 합니다. 따라서 MT5에서 컨트롤 클래스로 바로 오는 개체 클릭 이벤트 대신 마우스로 온 다음 컨트롤로 전달됩니다. CPU 절약은 어디에 있습니까?

아니면 내가 뭔가를 놓치고 있습니까?
 

마우스 개체는 개체 위에 있거나 개체가 현재 사용 중인 경우 개체 자체에 의해 수행되는 것처럼 보이지 않습니다. 그러나 마우스 개체는 이러한 정보를 저장할 수 있는 중심 "장소"입니다.

표준 제어 클래스는 모든 마우스 움직임에 대해 모든 개체가 루프를 통해 알아낼 수 있도록 작동합니다. 이 동작과 관련이 있는 경우 작업 관리자를 시작하고 그냥 이동할 때 쉽게 볼 수 있는 많은 CPU 시간이 걸립니다. EA 또는 표시기가 로드되고 CDialog 개체가 EA 또는 표시기의 일부일 때 마우스. 대화 상자가 복잡할수록 CPU 사용량이 높아집니다.

내 GUI에서는 전역 마우스 개체가 있으므로 이 작업이 다르게 수행됩니다. 10000개의 개체를 가질 수 있으며 마우스를 움직여도 CPU 사용량이 전혀 증가하지 않습니다. 그렇게 하면 마우스 버튼이 특정 개체에 내려갈 때만 이 특정 개체에 마우스 개체에 포커스가 있음을 알리고 이 버튼-다운 이벤트 이후에 마우스가 움직이면 다른 개체가 표시되지 않습니다. 개체는 이를 처리해야 하며 마우스의 추가 움직임/추가 마우스 이동 이벤트는 포인터를 사용하여 항상 배타적인 포커스가 있는 개체로 직접 라우팅됩니다.

그리고 상황 때문에 모든 차트 개체 는 시간/가격 기반(추세선 등)이든 픽셀 좌표 기반(패널 등)이든 상관없이 공통 기본 클래스를 가지고 있어도 이러한 모든 개체는 오버로드된 공통 집합을 사용할 수 있습니다. 이를 처리하는 함수. 그것은 또한 내가 CWnd와 CObject 사이에 누락된 클래스가 있다고 언급한 이유이기도 합니다. 왜냐하면 이 기본 클래스는 시간/가격 기반 객체에서도 사용되는 동일한 기본 클래스이기 때문입니다. 이러한 이벤트를 효과적으로 처리합니다.

 
그래서 실제로, 당신은 마우스 움직임을 듣는 것을 포기하고(객체 클릭을 직접 따르지 않는 한), 단지 마우스 클릭과 마우스 끌기에 주의를 기울입니다. 마우스 클릭의 경우 표준 lib와 동일하게 수행되며 개체 자체가 클릭을 감지하지만 드래그할 준비가 되어 있기 때문에 마우스가 위치를 유지하고 추가 드래그가 개체를 다시 호출하고 있음을 알립니다. 마우스가 드래그하지 않고 버튼을 들어올리면 개체 포인터를 삭제하여 클릭한 개체에 초점을 맞추는 것을 멈춥니다. 따라서 개체는 클릭을 수신하고 마우스는 드래그를 수신합니다.
따라서 마우스 움직임은 실제로 개체를 클릭하기 직전이 아니면 중요 하지 않은 것으로 무시된다는 결론이 내려집니다.
 

네.

그럼에도 불구하고 클릭 여부에 관계없이 움직임을 포착할 수 있는 옵션이 있으며 CPU 성능이 향상되고 개체 이름을 사용 하지 않지만 여기서 질문은 아닙니다.

 
네, 이제 의사 소통을 시도한 그림을 볼 수 있으며 개체를 반복할 필요 없이 마우스 자체에서 마우스 움직임도 들을 수 있는 방법이 분명히 있습니다. 또한 객체가 리스너로 등록할 때 포인터만 사용 하여 객체에 포커스가 있을 때 이를 알릴 수도 있습니다.