CHOU

[MSRDS] CCR에서 WinForm 이용해 보기 - 1 본문

Tech/Microsoft Products

[MSRDS] CCR에서 WinForm 이용해 보기 - 1

chobabo 2009. 3. 30. 13:00


 일반적으로 CCR은 UI 없이 백그라운드로 처리되는 프로그램에 주로 사용되는데, 직접 로봇을 컨트롤 한다던가 시뮬레이션 과정을 적절히 제어하기 위해서는 UI를 만들어 사용하는데 이때 WinForm을 다루게 됩니다. 오늘은 몇가지 메소드를 이용해서 WinForm을 적절히 사용하는 방법을 알아보겠습니다. 오늘도 역시 네이버 MSRDS 카페에 김영준 수석님께서 올려주신 예제를 수행해 보면서 이해해 보겠습니다.

 CCR에서 WInForm을 제어하기 위해서는 기존에 참조했던 것에 더해서 새로운 Ccr.Adapters.Winforms.dll을 추가해 주어야 합니다. 아래 그림과 같이 참조 추가를 선택해서 추가해주고 using을 이용하여 선언해 줍니다.


그림1. .NET 레퍼런스 추가화면




그림2. 소스코드 추가화면


1. WinFormsAdapter를 이용해서 WinForm 제어해 보기

 C#에서 UI는 거의 WinForms 형태로 구현되기 때문에 CCR에서는 특별히 WinFormsServicePort 라는 포트 객체를 지원하며, 이 포트 객체는 RunForm이라는 형태의 Form을 입력 값으로 받아 들입니다. 첫번째 예제는 WinFormsServicePort 객체와 RunForm 객체를 생성시킨 후에, 생성된 RunForm 객체를 WinFormsServicePort 에 등록시키는 것 입니다.  
 
 한가지 유의해야 할 점은 RunForm 객체는 일반적인 WinForm이 아니기 때문에, 먼저 일반적인 폼을 생성해 놓은 후에, 해당 폼 객체를 이용해 RunForm을 생성하면 됩니다.

먼저 UI에 버튼 하나를 추가해 준 후 아래의 코드를 입력합니다.

그림3. 버튼 추가화면


       private void button1_Click(object sender, EventArgs e)
        {
            Dispatcher dispatcher = new Dispatcher(0, System.Threading.ThreadPriority.Lowest, true, "10 examples");

            DispatcherQueue dq = new DispatcherQueue("DIspatcherQueue", dispatcher);

            //WinFormsSevicePort 정의하기
            WinFormsServicePort myWinFormPort = WinFormsAdapter.Create(dq);

            //RunForm 객체 생성
            RunForm runForm = new RunForm(
                delegate()
                {
                    return new myDialogForm("Hello!!.");
                }
            );

            //Construct Form through Post method
            myWinFormPort.Post(runForm);

        }

 버튼 이벤트 코드를 살펴보면 RunForm 객체를 생성할 때, myDialogForm이라는 WinForm을 초기화 하면서 "Hello!!"라는 문자열을 파라미터로 넘겨 줍니다. myDialogForm을 생성하기 위해 WinForm을 하나 생성하여 myDialogForm 이라는 이름을 주고 버튼과 텍스트 박스를 추가해 줍니다.


그림4. 버튼과 텍스트 박스 추가화면

그리고 버튼 이벤트 부분에 아래와 같은 부분을 추가해 주고 초기화 해주는 부분을 약간 수정해 줍니다.


    public partial class myDialogForm : Form
    {
        public myDialogForm(String msg)
        {
            InitializeComponent();

            textBox1.Text = msg;
        } //수정한 부분 입니다.

        private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread.CurrentThread.Abort();
        }
    }

위의 코드는 폼이 생성될 때 텍스트 박스에 표시될 값을 파라미터로 받고 텍스트 박스에 값을 지정하는 의미 입니다. 그리고 버튼 이벤트는 위에서 실행된 스레드를 종료시키는 코드 입니다. 앞서 실행한 윈폼과 지금 실행되는 윈폼은 별도의 스레드로 실행된다는 의미이고, 따라서 새로운 창을 종료 시키기 위해서는 버튼을 클릭해서 종료해야 합니다.


아래는 위의 예제가 실행되는 모습을 보여준 영상입니다.

영상1. 결과 영상


 네이버 카페에 있는 CCR 예제를 따라해 보면서 느낀건 C#을 어느정도 이해하고 있으면 메소드의 이름만 조금 특별 할 뿐 특이하게 어려운점이 발견되지 않는 것 같습니다. 최근에 개강 준비하느라고 공부를 좀 소흘히 한 점이 있는데 빨리 CCR 기본예제를 해보고 프로젝트에 응용해 보겠습니다.



참고자료

1. http://cafe.naver.com/msrskorea


2. 예제 코드파일