Core에서 View를 호출 하기
Core는 단순한 클래스이기 때문에 외부에서 메소드를 호출하여 실행하시면 됩니다. 따라서 Core가 어떤 기능을 제공하는 지만 알면 Core를 사용하는데 문제가 없습니다.
Payer의 코어가 제공하는 기능은 다음과 같습니다.
그런데, 저는 반대로 Core에서 View 오브트들을 호출하기 위해서는 직접적인 호출을 허용하고 있지 않습니다. Core에 View 오브젝트들에 대한 정보가 담겨지면 나중에 View 오브젝트들이 변경했을 때 재사용성에 문제가 되기 때문입니다.
Core는 View 오브젝트들의 대표자인 TCore.Obj.View 객체만을 사용합니다. 그리고, TCore.Obj.View.Add(Object) 를 이용해서 IView에 등록 된 모든 객체에게 메시지를 전달하여 원하는 동작을 하도록 합니다. "Observer Pattern" 과 RTTI 를 이용합니다.
[그림 1] Core가 View 오브젝트를 호출하는 장면
[그림 1]에서처럼 Core는 View 객체들에게 메시지를 전달하기 위해서 멤버인 View에 선언되어 있는 메시지 전송 메소드를 실행합니다. View는 자신에게 메시지 구독 신청을 위해 등록 된 모든 객체에게 해당 메시지를 전달합니다. 그리고 객체들은 자신이 처리해야 할 메시지인 경우 해당 메시지를 처리하면 되고, 아니면 무시하면 됩니다.
이를 통해서 Core는 실제 View 관련 오브젝트들에 대한 정보 없이 필요한 메시지를 통보하는 형식을 취하게 됩니다.
이것은 제가 APP(Abstract Presentation Pattern) 라는 이름으로 만든 패턴이며, http://ryulib.tistory.com/245 포스트를 참고하시기 바랍니다.
코드를 통해서 이해하기
기존 소스에서는 타이머를 통해서 새로운 이미지가 있는 지를 계속 점검하여 화면에 표시하는 형태를 취했습니다. 하지만, 새로운 소스는 Core 내부에서 보내지고 있는 rp_BitmapOfDeskCamDecoderIsReady 를 캐치해서 57-60: 라인과 같이 처리하고 있습니다.
현재 소스의 20: 라인에보면 메시지 수신용 메소드가 선언되어 있습니다. RTTI를 이용해서 호출하고 있어서 published 에 선언되어야 합니다.
해당 메소드를 호출하는 곳은 어디에도 없지만, 메시지의 이름과 동일하기만 하면 자동으로 호출됩니다. 따라서, 자신이 해당 메시지를 받아서 처리해야 하는 경우에는 단지 published 영역에 메소드를 선언만 하면 됩니다.
TValueList는 TStringList를 상속 받은 클래스이며, RyuLib에 포함되어 있습니다. 6: 라인에서처럼 ValueList 유닛을 추가 해줘야 합니다. 메시지의 파라메터의 개수가 일정 할 수 없기 때문에 TStringList를 이용해서 파라메터를 전달 받고 있습니다.
54: 라인에 보면 폼의 OnCreate 이벤트에서 폼 자신을 View에 등록하고 있습니다. 등록이 되지 않은 객체는 Core로 부터 메시지를 받을 수가 없습니다.
35: 라인은 폼이 OnClose 될 때 View 등록을 해지하고 있습니다. View는 더 이상 이 객체를 찾아서 메시지를 보내지 않습니다.
[그림 2]
[그림 2]는 코드의 동작을 다이어그램으로 표현한 것입니다. View에 있는 sp_BitmapOfDeskCamDecoderIsReady 메소드는 밖에서는 호출 할 수 없으며, Core 내부에서만 동작합니다.
메시지를 전송하는 메소드는 "sp_"로 시작하며, 메시지를 수신하는 메소드는 "rp_"로 시작합니다. 그 뒤에는 똑같은 이름이 있는 경우에 자동으로 해당 메소드를 실행하게 됩니다.
Player의 코어에서 View 객체에게 전달하는 메시지 종류
아래 링크는 TView에 대한 설명입니다. sp_로 시작하는 메소드들은 해당 이름과 같은 rp_ 메시지를 발생합니다. 그리고 각각의 메시지의 의미는 Description 에 설명되어 있습니다.
TView 는 TViewBase 를 상속 받았습니다. 따라서, TViewBase 에서 전송하는 메시지들도 수신됩니다. TViewBase 클래스에 대한 설명은 아래 링크에 있습니다.
PC 화면 압축과 실시간 전송에 대한 연구 (0) | 2013.10.20 |
---|---|
HiMyTV 방송 서버 구조 #2 - DB에 대한 비동기 처리 (0) | 2013.07.22 |
HiMyTV Player 만들기 #2 - Core Module에 대한 이해 (0) | 2013.07.13 |
The Core of HiMyTV Player (0) | 2013.07.13 |
움직이는 타켓을 멈추게 하라 (0) | 2013.07.10 |