[Archive] 강좌게시판

취소
다음에 대한 결과 표시 
다음에 대한 검색 
다음을 의미합니까? 

[myLV.net 집필진 강좌] Actor Framework 실습 예제 - 1

 

 

 [myLV.net 집필진 강좌 – 웅킹킹킹]

 

안녕하세요. 웅킹킹킹 입니다.

 

 

지난 시간 OOP과정을 벗어나 Actor Framework의 메커니즘을 아주 간단하게 설명해드렸습니다.
다시 복습하자면

 

  1. Actor 클래스는 생산자 소비자 구조의 소비자 역할을 하는 Actor Core.vi를 Method로 가지고 있어 프로그래머가 구현한 특정 알고리즘(행위)를 할 수 있는 클래스이다.

 

  1. Message 클래스는 Actor 클래스에게 명령을 전달하는 매개체이다. 즉 생산자 소비자 구조의 생산자 역할을 한다.
    예를 들어 데이터 수집이라는 명령(메시지)를 담아 Actor 클래스에게 전달하게 되면 Actor클래스는 명령을 받아서 데이터 수집을 수행 한다.

 

입니다. 기본적으로 Actor Framework는 생산자 소비자 구조(QDMH)를 따릅니다. 다만 OOP 기반이라는 점이 달라 우리 프로그래머를 힘들게 합니다.

 

그럼에도 불구하고 생산자 소비자 구조가 아닌 Actor Framework를 추천합니다.
생산자 소비자 구조(QDMH)를 많이 사용해보신 개발자들은 개발 중 불편하거나 힘들게 개발해야 되는 부분이 분명히 있었을 것입니다. 그런 부분들을 Actor Framework는 OOP 기반의 장점을 토대로 보완된 프로그래밍 패턴입니다.

 

Actor Framework는 생산자 소비자 구조(QDMH)이므로 생산자 소비자 구조의 모든 장점은

 

 

  1. Queue 기반의 데이터 안전성

 

  1. 생산자와 소비자가 분리되어 구현하기 쉬운 프로그램 흐름 구조

 

  1. 프로그램 흐름에 따라 개발함으로써 Deadlock / Race Condition 감소

 

 

따르게 되며 단점은

 

 

  1. 조금 다른 알고리즘 구현 시 필요에 따라 여러 소비자 케이스 유발

 

  1. 2개의 이상의 소비자 구조 구현 시 제어하기 어려움.

 

 

보완하게 됩니다.

 

그럼 지금까지 설명해드린 Actor Framework를 간단한 예제를 구현하면서 좀더 체감적으로 느낄 수 있는 시간을 가져보도록 하겠습니다.

 

이 예제는 https://decibel.ni.com/content/docs/DOC-42227에서 가져왔습니다. 저는 한글화 혹은 부가적인 설명만 추가했음 알려드립니다. 해당 예제를 채택한 이유는 Message 클래스의 구현을 자동 생성이 아닌 직접 Coding을 하여 만든 예제이며 3 Actor System(3개의 Actor)으로 멀티 Actor 클래스의 구조를 지녀 좀더 Actor 클래스에 대한 이해도가 높아질 것으로 기대해서 이 예제를 채택했습니다. (보통 기본 예제는 한 개의 Actor 클래스로 구현.)

 

해당 예제의 하이퍼링크에 접속하여 꼭 한번 문서와 예제파일을 공부하시길 바랍니다.

 

 

 

 

  1. 프로젝트 폴더 생성

 

그림 1 프로젝트 폴더 생성그림 1 프로젝트 폴더 생성

 

그림 1과 같이 프로젝트에서 Actor 클래스, Message 클래스를 구분할 폴더를 생성합니다.

보통 주 Actor 클래스 폴더의 안에 해당 Actor 클래스 폴더, Message 클래스 폴더를 생성합니다.

 

  1. 프로젝트 생성

  

 

그림 2 프로젝트 생성 - Add-Multiply Actor Project그림 2 프로젝트 생성 - Add-Multiply Actor Project

 

1.  Add-Multiply Actor Project 폴더에서 Add-Multiply Actor Project.lvproj 생성.

2.  프로젝트 파일 저장.

  

 

그림 3 프로젝트 버츄얼 폴더그림 3 프로젝트 버츄얼 폴더

 

3. 그림 3과 같이 프로젝트 버츄얼 폴더 생성.

 

그림 4 Actor Framework 라이브러리 추가그림 4 Actor Framework 라이브러리 추가

 

그림 5 Actor Framework 라이브러리 추가 완료그림 5 Actor Framework 라이브러리 추가 완료

 4. 그림 4, 5 과정을 통해 Actor Framework 라이브러리 프로젝트에 추가.
* Actor Framework 라이브러리를 추가함으로써 관련 리소스를 작업 프로젝트에서 사용할 수 있게 하기 위함.

 

 

  1. 클래스 생성

    Calculator Actor, Addition Actor, Multiplication Actor 3개의 클래스를 Actor Framework 라이브러리의 Actor 클래스에서 상속받아 하위클래스로 생성.

 

그림 6 Actor 클래스 추가그림 6 Actor 클래스 추가

 

그림 7 Actor 클래스 상속그림 7 Actor 클래스 상속

 

 1. 그림 6, 7 과정을 거쳐 Actor 클래스 생성.

 

  

그림 8 클래스 파일 저장그림 8 클래스 파일 저장

 

2. Add-Multiply Actor Project\Actors\Calculator Actor\Calculator Actor Class 위치에 Calculator Actor 클래스 파일 저장.

3. 나머지 Addition Actor, Multiplication Actor 클래스도 i, ii 과 같은 방식으로 생성 및 저장.

 

그림 9 아이콘 편집 설정그림 9 아이콘 편집 설정

 

 

4. 그림 9, 10 과정을 통해 클래스 아이콘 편집

5. 나머지 Addition Actor, Multiplication Actor 클래스도 iv 와 같은 방식으로 아이콘 편집.

 

 

 

 

그림 11 클래스 계층 구조그림 11 클래스 계층 구조

 

6. 클래스 생성 완료. Ctrl + U 클릭하여 클래스 계층 구조 확인.

* Calculator, Addition, Multiplication Actor가 Actor Framework 라이브러리의 Actor 클래스의 하위클래스로 설정된 것을 확인할 수 있다.

 

 

  1. Launcher 생성.

    Actor Framework로 프로젝트를 진행 시 일반적으로 Main VI를 동작하기 위해 특별한 Launcher VI를 만들어야 합니다. 통상적으로 Main VI 와 같은 역할을 하는 Actor를 Root Actor라고 하며 이 예제에서는 Calculator Actor가Root Actor 입니다.

  

 

그림 12 Launcher VI 생성그림 12 Launcher VI 생성

 

1. 프로젝트 내 컴퓨터 하위에 Launcher.vi 생성.

 

2. Add-Multiply Actor Project 폴더에 Launcher.vi 파일 저장.

  

 

그림 13 Laucher VI Code 작업그림 13 Laucher VI Code 작업

  

3.  그림 13 과 같은 블록다이어그램 소스코드 작업.
* Launch Root Actor.vi 는 블록다이어그램 -> 데이터 통신 -> 액터 프레임워크 팔레트에 위치합니다.

 

 

  1. Calculator Actor(Root Actor) 프로그래밍

    Calculator Actor ? Root Actor  Main VI에 해당하는 User Interface를 구현하고 나머지 Addition Actor, Multiplication Actor를 호출하고 메시지를 보내 Actor가 가진 임무를 수행하게 합니다.

 

 

그림 14 Actor 클래스 덮어쓰기를 위한 VI그림 14 Actor 클래스 덮어쓰기를 위한 VI

 

그림 15 Actor Core.vi 덮어쓰기그림 15 Actor Core.vi 덮어쓰기

1. 그림 14, 15 과정을 거쳐 Actor Core.vi 덮어쓰기.
Actor Core.vi 파일 저장. (Calculator 클래스가 저장된 위치에 저장)
* 상위 클래스 Actor 클래스의 Method를 하위 클래스에서 덮어쓰기(Overwrite)하여 상위 클래스의 Code를 그대로 재사용 합니다.

 

16.png

 

그림 16 Calculator Actor - Actor Core.vi 정지 이벤트그림 16 Calculator Actor - Actor Core.vi 정지 이벤트

 

2.  프로그램 정지를 위한 사용자 이벤트 생성. (이벤트 명칭 : Stop Event)
* 그림 16 블록다이어그램 참조

 

3.  생성한 사용자 이벤트 등록.
* 그림 16 블록다이어그램 참조

 

4. While Loop와 Event Case를 구현하여 사용자 이벤트 케이스 생성.
* 그림 16 블록다이어그램 참조

 

 

 

그림 17 Calculator 클래스 Data 멤버 추가 - Stop Event 참조그림 17 Calculator 클래스 Data 멤버 추가 - Stop Event 참조

  

5.  ii ~ iv 과정에서 추가한 Stop Event (사용자 이벤트)의 참조 컨트롤 생성하여 Calculator 클래스의 Data 멤버로 추가.

 

  

그림 18 Data 멤버 Stop Event그림 18 Data 멤버 Stop Event

  

6. Data 멤버- Stop Event에 생성한 사용자 이벤트 정보를 입력합니다.
* Data 멤버 - Stop Event에 사용자 이벤트 정보를 입력하여 모든 Method에서 프로그램을 정지할 수 있는 정보를 가지게 됩니다.

 

 

 

 

그림 19 Stop Core.vi 덮어쓰기그림 19 Stop Core.vi 덮어쓰기 

7. Actor Core.vi를 덮어쓰기 방식과 같은 방식으로 Stop Core.vi 덮어쓰기.

Calculator 클래스가 저장된 위치에 Stop Core.vi 파일 저장.

 

 

 

20.png

 

그림 20 Calculator Actor - Stop Core.vi 정지 이벤트 발생그림 20 Calculator Actor - Stop Core.vi 정지 이벤트 발생

 

 

8. Stop Core.vi 블록다이어그램을 그림 20과 같이 프로그래밍.
* Actor 클래스는 종료될 때 항상 Stop Core.vi가 실행되는 데 여기에 Stop Event를 발생시켜 Actor Core.vi의 While Loop를 종료시켜 Actor Core.vi가 종료될 수 있도록 함.

 

 

그림 21 Framework Override 버츄얼 폴더 생성 및 관리그림 21 Framework Override 버츄얼 폴더 생성 및 관리

 

9.  Calculator 클래스 하위에 버츄얼 폴더 Framework Overrides 생성.
Framework Overrides 하위에 Actor Core.vi, Stop Core.vi 파일 포함해서 관리.
* 클래스의 Method를 효율적으로 관리하기 위해 버츄얼 폴더 기능을 이용.

  

 

그림 22 Calculator Actor - Actor Core.vi Stop 버튼 추가그림 22 Calculator Actor - Actor Core.vi Stop 버튼 추가

  10.  Calculator Actor - Actor Core.vi 프런트 패널에 Stop 버튼 추가.
* Actor Core.vi의 프런트 패널은 User Interface를 구현할 수 있습니다.

  그림 23 Calculator Actor - Actor Core.vi 정지 메시지 발송그림 23 Calculator Actor - Actor Core.vi 정지 메시지 발송

 

11. Calculator Actor - Actor Core.vi 블록다이어그램에 정지 메시지 전송 프로그래밍.

Read Self Enqueuer.vi와 Send Normal Stop.vi는 액터 프레임워크 팔레트에서 찾을 수 있습니다.
* Calculator 클래스의 Enqueuer 정보를 읽어서 Calculator 클래스에 정지메시지를 전송합니다.

 

 

 

그림 24 Calculator Actor - Actor Core.vi VI 프로퍼티 설정그림 24 Calculator Actor - Actor Core.vi VI 프로퍼티 설정

 

그림 25 Calculator Actor - Actor Core.vi 윈도우 모양 프로퍼티 설정그림 25 Calculator Actor - Actor Core.vi 윈도우 모양 프로퍼티 설정

 

 

12. Calculator Actor - Actor Core.vi의 프로퍼티 설정.
윈도우 모양 프로퍼티 설정을 변경하여 프런트 패널이 팝업이 되도록 합니다. 그림 25 참조

 

 

  1. 프로그램 중간 테스트

    현재까지 구현한 내용을 테스트 합니다. Calculator Actor, Addition Actor, Multiplication Actor 3개의 Actor  Root Actor의 프로그램 정지 기능까지 구현한 부분을 테스트 합니다.

 1. Launcher.vi 실행

 

 

그림 26 Calculator Actor - Actor Core.vi 실행그림 26 Calculator Actor - Actor Core.vi 실행

 

 2.  Calculator Actor - Actor Core.vi가 실행되는 것을 확인.

 

3. 정지 버튼을 클릭하여 프로그램이 정상적으로 정지하는 것을 확인.

 

 

Actor Framework의Actor 클래스를 상속하여 Actor 클래스를 만들고 Actor Core.vi, Stop Core.vi를 덮어쓰기(Override)하여 상위 클래스의 Method를 재사용하는 방법을 알아보았습니다.

 

그리고 Actor 클래스는 기존의 VI를 실행하는 방법과 다르게 Launch Root Actor.vi 함수를 이용해서 실행을 한다는 것도 알 수 있었습니다.


그 이유는 Actor 클래스의 필수 Method를 실행해야 하기 때문입니다. Launch Root Actor.vi 함수를 이용해서 실행함으로써 Actor 클래스가 필요한 Queue를 먼저 생성하고 생성된 Queue의 소비자 루프가 있는 Actor Core.vi를 실행합니다.

 

그리고 Actor가 종료할 때는 Send Normal Stop.vi 메시지 전송 함수를 사용해서 Actor 클래스가 Stop Core.vi Method를 실행하면서 Actor 클래스가 종료됩니다.

 

여기까지가 Actor 클래스의 구현, 실행, 정지 과정입니다.
우리는 통상적인 생산자 소비자 구조의 Queue, 소비자 루프를 구현하지 않았지만 모든 기능을 사용해서 프로그램을 만들고 정지했습니다.
OOP와 Actor Framework의 강력한 힘이 느껴지시나요?

 

다음 시간에는 Addition Actor와 Multiplication과 같은 Nested Actor를 구현하고 Message 하위 클래스를 구현하면서 예제 프로그램을 완성할 예정입니다.

기여자