개요
상황 : 2개의 클래스 A(예 CCyFinDevice), B(예 CCyFinOnNewBar) 가 있고, A에서 B 인스턴스 만들어 사용중이고, B에게 A측의 콜백함수를 전달해야함.
문제점
클래스의 멤버함수는 콜백으로 전달 불가하므로 A에서 콜백함수를 static 으로 선언하면 B 에게 전달은 가능하다. A 의 static 함수 내부에서는 A의 멤버에 접근 못하게 되고 결국에 C스타일 코드 구조가 나와 모듈화가 달성되지 않아 견고한 구조화를 심각하게 방해한다.
해결책
- 클래스 A의 non-static 멤버 함수를 콜백으로 사용가능하게 한다.
MQL5 의 EA 에서 클래스 B 로 전달할 콜백함수를 만들고, ea 의 콜백함수 내에서 클래스 A의 멤버함수를 실행하게 하고, 클래스 B측으로 EA의 함수포인터를 전달한다.
/////////////////////// function pointer typedef. myglobal.mqh etc.
typedef void(*pf_VENUMTIMEFRAMES)(ENUM_TIMEFRAMES);
//////// EA 측의 코드.
CCyFinDevice m_CCyFinDevice(ChartGetInteger(0,CHART_WINDOW_HANDLE),1);
void cb_Proc_OnNewBar_EA(ENUM_TIMEFRAMES timeframe) // 이 함수를 CCyFinOnNewBar 에서 콜백하게됨.
{
m_CCyFinDevice.Proc_OnNewBar_CallBack(timeframe);// non-static member function !!!! good
}
int OnInit()
{
/// EA에서 정의된 전역함수포인터를 전달하고, CCyFinDevice 내부에서 이함수 포인터를 CCyFinOnNewBar 로 전달.
m_CCyFinDevice.RegiCallBack_forOnNewBar(cb_Proc_OnNewBar_EA);
...
}
연관
mql5에서 함수포인터 지원됨.
콜백 개념이해.
첫 등록 : 2019.05.21
최종 수정 : 2023.03.20
단축 주소 : https://igotit.tistory.com/2186
'트레이딩 > 메타트레이더 코딩' 카테고리의 다른 글
MQL5. input (0) | 2019.05.27 |
---|---|
MQL5. memcpy 사용하기 (0) | 2019.05.21 |
MQL5. DLL. #import (0) | 2019.05.19 |
MQL5. Generic Data Collection. CHashMap. 딕셔너리 (0) | 2019.05.18 |
MQL5. Arrays. 배열 (0) | 2019.05.17 |
댓글