블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

OpenMP 라고 아십니까??

Programming Tip 2008/07/27 22:37 귀차니스트
  VS.net 2008에서 몇일 전 컴파일러 옵션에 대해서 이렇게 저렇게 조절을 하면서 저도 처음으로 OpenMP라는 옵션이 있다는 것을 알게되었습니다. 그냥 이름만 딱 봤을땐 Multi Process에 관련된 기능이라는 느낌이 오더군요. 예전에 C#에서 멀티 프로세싱에 관련된 어떠한 라이브러리에 대한 소개를 보았기 때문에 혹시 그런 종류가 아닐까 했습니다.
  찾아보니 위에 언급한 라이브러리 부류더군요. 다만 다른 점은 Directive로 정의된다는 것일까요. 뭐 일단 OpenMP의 특징은 "공유 메모리를 사용하는 환경의 병렬화 프로그래밍의 표준"입니다. 고로 다른 플랫폼에서도 사용할 수 있습니다. 제가 찾아보니 리눅스에서도 가능하고, 썬 스튜디오 컴파일러에서도 가능하군요. 썬 스튜디오 컴파일러에서 된다면 x86서버 쪽일지라도 솔라리스에서 될지도 모르겠군요. 일단 Open그대로 여러가지 환경에서 사용될 수 있다는 것에 대해서는 무척 환영합니다. 사실 이런 기능이 하나, 둘 추가될 때마다 C++이란 언어가 괴물이 되어간다는 생각을 떨쳐버릴수가 없군요. 일단  간단한 예는 아래와 같더군요.

Atomic.cpp (Language : cpp)
  1. // omp_atomic.cpp
  2. // compile with: /openmp
  3. #include <stdio.h>
  4. #include <omp.h>
  5.  
  6. #define MAX 10
  7.  
  8. int main() {
  9.    int count = 0;
  10.    #pragma omp parallel num_threads(MAX)
  11.    {
  12.       #pragma omp atomic
  13.       count++;
  14.    }
  15.    printf_s("Number of threads: %d\n", count);
  16. }

  Directive로 이루어지다 보니 num_threads에 해당하는 Thread의 개수를 지정하여 아래의 블럭을 실행하는 쓰레드를 MAX개수 만큼 생성하여 해당 atomic에 대한 Multiple Write Protect를 수행하게 됩니다. 결국 수행하는 것만으로도 CPU에 대한 쓰레드 점유를 늘릴 수 있다는 거죠. 굳이 쓰레드를 여러가지 써가면서 작동하는 코드를 직접 써주지 않아도 된다는 말이됩니다.
  물론 Thread 라는게 실질적으로 하나의 CPU에서 돌아갈 때는 Register에 자료를 저장한 다음, 다음에 수행해야 할 명령에 의하여 자료가 조작되기 때문에 돌아가는 속도가 빠를 수도 있기 때문에, 메모리에 액세스하여야 한다는 점을 유의하여 코드를 작성해야 합니다.
  그리고 무조건 적인 Directive로만으로 이루어진 것은 아니더군요. 언어에 맞도록 lib를 통한 해당 헤더를 인클루드하게 되면 OpenMP에 해당하는 함수를 사용할 수도 있습니다.

num_thread.cpp (Language : cpp)
  1. // omp_get_num_threads.cpp
  2. // compile with: /openmp
  3. #include <stdio.h>
  4. #include <omp.h>
  5.  
  6. int main()
  7. {
  8.     omp_set_num_threads(4);
  9.     printf_s("%d\n", omp_get_num_threads( ));
  10.     #pragma omp parallel
  11.         #pragma omp master
  12.         {
  13.             printf_s("%d\n", omp_get_num_threads( ));
  14.         }
  15.  
  16.     printf_s("%d\n", omp_get_num_threads( ));
  17.  
  18.     #pragma omp parallel num_threads(3)
  19.         #pragma omp master
  20.         {
  21.             printf_s("%d\n", omp_get_num_threads( ));
  22.         }
  23.  
  24.     printf_s("%d\n", omp_get_num_threads( ));
  25. }

  결과는 MSDN에 존재하는 대로 1, 4, 1, 3, 1 그대로 나오더군요. 기본적으로 해당하는 Directive 명령어들과 연계가 되어 작동하는것 같군요. 뭐 결과를 보면 그렇게 말할 수 밖에 없겠습니다. #pragma pack(1)과 같이 기존 코드 생성에 해당하는 것을 변형시키는 지시자에 비하여, 실질적으로 생성되는 코드가 다르겠지만 사용자가 사용하는 프로그래머 측면에서는 결과를 모르게 사용할 수 있게 했다는 것에 대하여 큰 가산점을 주고 싶군요.
  왠지 여러가지를 살펴보면서 얻는게 꽤 많은 것 같은데, 다들 유용하게 사용해보셨으면 좋겠군요^^;

http://msdn.microsoft.com/ko-kr/library/tt15eb9t.aspx
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

심심해서 구현해본 그래픽 요소 (0)2008/07/03
Child Window Mouse Message 문제. (0)2008/07/01
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
GDI+ 사용 시 Smart Pointer 란?? (0)2008/04/12
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/07/27 22:37 2008/07/27 22:37
TAG Directive, OpenMP, 병렬, 병렬처리
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/97

댓글을 달아 주세요

심심해서 구현해본 그래픽 요소

Programming Tip 2008/07/03 23:58 귀차니스트
  요새 그나마 집에 빨리 돌아오기 때문에 PSP 프로그램을 만드는 도중 갑자기 심심해서 이런 저런 기능들을 올려두면 괜찮을것 같은 생각이 드는게 있어서 옛날에 만들어 사용했었던 부분을 약간 정리해봤습니다( 정리라고 하기엔 지저분한 소스네요 ). 일단 첫 번째는 폴리곤이랄까요 그 부분 이동하는 부분과 입력하는 부분을 대충 간단하게 구현해 봤습니다.

DrawPolygon.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication2
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         enum ProcessMode
  15.         {
  16.             Input,
  17.             Move
  18.         };
  19.  
  20.         List<Point> m_PointList = new List<Point>();
  21.         ProcessMode m_Mode = ProcessMode.Input;
  22.         int m_MoveIndex = -1;
  23.  
  24.         public Form1()
  25.         {
  26.             InitializeComponent();
  27.         }
  28.  
  29.         private void Form1_MouseDown(object sender, MouseEventArgs e)
  30.         {
  31.             if (e.Button == MouseButtons.Right)
  32.             {
  33.                 m_Mode = ProcessMode.Move;
  34.                 return;
  35.             }
  36.  
  37.             switch (m_Mode)
  38.             {
  39.                 case ProcessMode.Input:
  40.                     m_PointList.Add(e.Location);
  41.                     break;
  42.                 case ProcessMode.Move:
  43.                     for( int i = 0; i < m_PointList.Count; ++i )
  44.                         if (IsRectangle(e.Location, m_PointList[i], 5))
  45.                         {
  46.                             m_MoveIndex = i;
  47.                             break;
  48.                         }
  49.                     break;
  50.             }
  51.  
  52.             Invalidate();
  53.         }
  54.  
  55.         private void Form1_MouseUp(object sender, MouseEventArgs e)
  56.         {
  57.             m_MoveIndex = -1;
  58.         }
  59.  
  60.         private void Form1_MouseMove(object sender, MouseEventArgs e)
  61.         {
  62.             if (m_MoveIndex != -1)
  63.                 m_PointList[m_MoveIndex] = e.Location;
  64.  
  65.             Invalidate();
  66.         }
  67.  
  68.         private bool IsRectangle(Point Pt, Point Point, int Margin)
  69.         {
  70.             if ((Point.X - Margin <= Pt.X && Pt.X <= Point.X + Margin) &&
  71.                 (Point.Y - Margin <= Pt.Y && Pt.Y <= Point.Y + Margin))
  72.                 return true;
  73.  
  74.             return false;
  75.         }
  76.  
  77.         private void Form1_Paint(object sender, PaintEventArgs e)
  78.         {
  79.             if (m_PointList.Count > 1)
  80.             {
  81.                 Point[] PtList = new Point[m_PointList.Count];
  82.                 for (int i = 0; i < m_PointList.Count; ++i)
  83.                 {
  84.  
  85.                     PtList[i] = m_PointList[i];
  86.                 }
  87.  
  88.                 System.Drawing.Drawing2D.GraphicsPath Path = new System.Drawing.Drawing2D.GraphicsPath();
  89.                 Path.AddLines(PtList);
  90.  
  91.                 e.Graphics.FillPath(Brushes.Black, Path);
  92.                 foreach (Point Pt in PtList)
  93.                     e.Graphics.FillRectangle(Brushes.Gray, Pt.X - 5, Pt.Y - 5, 10, 10);
  94.             }
  95.         }
  96.     }
  97. }
  98.  



  간단하게 이렇게 구현이 되었습니다. 이건 뭐 별로 어렵지는 않은데, 귀찮아도 나중에 필요할데가 있을듯 하군요.
  그리고 두 번째는 일종의 회전입니다. 마우스를 다운하고 마우스를 움직이면 해당 그림쪽이 회전되는 것입니다. 보통 X, Y의 간단한 계산으로는 자연스럽고 부드러운 회전이 불가능하고 atan2등의 삼각함수를 사용하면 부드럽게 가능합니다.

Spin.cs (Language : csharp)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace WindowsFormsApplication3
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         double Degree = 0.00;
  15.         bool IsDown = false;
  16.  
  17.         double MoveDegree = 0.00;
  18.         double FirstDegree = 0.00;
  19.  
  20.         public Form1()
  21.         {
  22.             InitializeComponent();
  23.         }
  24.  
  25.         private void Form1_MouseDown(object sender, MouseEventArgs e)
  26.         {
  27.             FirstDegree = Math.Atan2( 150 - e.Y, 150 - e.X);
  28.             IsDown = true;
  29.         }
  30.  
  31.         private void Form1_MouseUp(object sender, MouseEventArgs e)
  32.         {
  33.             IsDown = false;
  34.             Degree -= MoveDegree;
  35.             MoveDegree = 0.00;
  36.         }
  37.  
  38.         private void Form1_MouseMove(object sender, MouseEventArgs e)
  39.         {
  40.             if (IsDown)
  41.                 MoveDegree = FirstDegree + Math.Atan2(150 - e.Y, 150 - e.X);
  42.  
  43.             Invalidate();
  44.         }
  45.  
  46.         private void Form1_Paint(object sender, PaintEventArgs e)
  47.         {
  48.             Graphics g = e.Graphics;
  49.  
  50.             g.MultiplyTransform(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 150, 150 ));
  51.             g.MultiplyTransform(new System.Drawing.Drawing2D.Matrix((float)Math.Cos(Degree - MoveDegree), (float)-Math.Sin(Degree - MoveDegree),
  52.                 (float)Math.Sin(Degree - MoveDegree), (float)Math.Cos(Degree - MoveDegree), 0, 0));
  53.             g.MultiplyTransform(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, -150, -150 ));
  54.             g.FillRectangle(Brushes.Black, 100, 100, 100, 100);
  55.         }
  56.     }
  57. }
  58.  



  Atan2 함수를 사용하게 되면 0,0 포인트를 기준으로 X, Y좌표에 해당하는 각도를 반환해 줍니다. 그것을 이용한다면 C# 에서 기본적으로 Mapping 되어 지원되는 GDI+의 MultiplyMatrix로 회전식을 곱해주면 되겠죠^^. 물론 회전 수식 전엔 사각형 가운데로 원점을 이동시켜주어야 한다는 점이 존재합니다.
  갑자기 허접하고 이상하긴 하지만 어딘가엔 필요할 것 같네요. 그럼 또 즐거운 하루 되세요.

크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

OpenMP 라고 아십니까?? (0)2008/07/27
Child Window Mouse Message 문제. (0)2008/07/01
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
GDI+ 사용 시 Smart Pointer 란?? (0)2008/04/12
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/07/03 23:58 2008/07/03 23:58
TAG GDI+, Graphi
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/85

댓글을 달아 주세요

Child Window Mouse Message 문제.

Programming Tip 2008/07/01 23:17 귀차니스트
  이런 문제를 한 번쯤 겪어보셨을지 모르겠습니다. 필요에 의해서 프로그래밍을 하다 보니 이런 경우가 생기더군요. MDI Window를 쓰지 않고, 해당 윈도우를 Mdi Child화 비슷하게 사용하는 것이죠. 그래서 이 구현으로 인해 다이얼로그를 2개 만들고 하나의 다이얼로그 윈도우의 부모를 다른 하나의 다이얼로그로 지정해 주었습니다. 그랬더니 자식으로 설정된 다이얼로그에 존재하는 컨트롤에 키보드나 마우스 메시지가 전달되지 않더군요. 물론 기본적으로 생성할 경우에 그렇습니다.



Parent.cpp (Language : cpp)
  1. abc.Create(IDD_DIALOG, this);
  2. abc.SetParent(this);
  3. abc.ShowWindow(SW_SHOW);

  바로 위와 같은 경우를 만들 경우 빨간 사각형으로 강조된 컨트롤이 반응하지 않게 됩니다. 아예 키보드를 누르나 마우스를 누르나 동작하지 않는 것이죠. C# 에서는 입력은 되지만 마우스 메시지가 제대로 먹지 않더군요. 마우스 메시지가 잘 먹지 않는다면 해당 윈도우에 대한 텍스트 선택, 편집 작업이 무척 불편하게 됩니다. 그래서 이런 저런 해결방법을 찾아봤습니다. 결국 하나의 방법이 나오긴 하더군요.



  잘 보이지는 않지만 해당 자식 Dialog의 Border를 None으로 설정해주시면 됩니다. 이렇게 하면 결국 메시지가 제대로 전달되고 작동되더군요. Control 자체를 작성하는 경우도 존재하기 때문에 기본 WndProc 에서 Border에 따른 처리를 하는 것 같더군요.



  제대로 작동 되는 군요. 물론 여기서 내부 다이얼로그 박스가 윈도우 처럼 작동하기 위해서는 WM_NCHITTEST 등의 메시지를 처리하거나, MOUSEDOWN, MOUSEUP, MOUSEMOVE등의 작업을 수동적으로 제어하여 윈도우의 위치를 이동해주어야 합니다. 약간 번거롭긴 하네요.
  따로 해결할 수 있는 방법이 있는지는 모르겠지만 제가 찾은 방법은 이것이더군요. 무난하게 작동하긴 하니 뭐 별 문제는 없습니다. 하지만 혹시 더 좋은 방법이 있음 댓글로 달아주셨으면 합니다.
  그럼 내일도 즐거운 하루 되시길 바라면서 좋은 꿈 꾸세요^^.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

OpenMP 라고 아십니까?? (0)2008/07/27
심심해서 구현해본 그래픽 요소 (0)2008/07/03
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
GDI+ 사용 시 Smart Pointer 란?? (0)2008/04/12
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/07/01 23:17 2008/07/01 23:17
TAG Dialog, Mouse Message, Parent
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/84

댓글을 달아 주세요

버퍼 오버플로우, 오버런이란??

Programming Tip 2008/04/27 23:57 귀차니스트
  해킹이라는 것은 아주 많이 들어보셨을 겁니다. 최근 들어서 사회가 정보화 사회로 탈바꿈 되었고, 이미 대한민국은 컴퓨터 혹은 네트워크없이는 말을 못할 정도로 크게 발전이 되었죠. 그로 인해, 해킹이라는 것 또한 이슈로 떠올랐을 겁니다. 최근 들어서 옥션 개인 정보 유출등의 사건과도 연관을 지을 수도 있는 부분입니다.
  이 해킹혹은 크래킹에 있어서 주요한 원인은 어떤 것일까요? 가장 크게 말해서 프로그램 제작상 소스코딩의 오류라고 표현을 할 수 있다고 합니다. 왜 그런가 하면 아래의 코드를 한 번 보도록 할 까요?

Test.cpp (Language : cpp)
  1. #include <iostream>
  2.  
  3. void Process()
  4. {
  5.     char InputData[100];
  6.     gets( InputData );
  7. }
  8.  
  9. int main( int argc, char **argv )
  10. {
  11.     Process();
  12. }

  이 같은 경우 어떠한 문제를 불러일으킬 수 있을까요?? 흔히 C++, C 코드가 기계어로 바뀌는 과정을 대충적이나마 알고 계신 분들은 원인을 대충 아실 겁니다. 함수를 호출하기 위해서는 스택에 return 될 코드를 push 한 뒤, Call 명령 혹은 Jmp 명령으로 호출하게 되죠, 그런데 지역 변수라는 것 또한 해당 컨텍스트의 스택에 존재하게 된다는 게 이 코드의 문제점 원인 입니다.

return 될 주소
첫 번째 인자.
두 번째 인자.
세 번째 인자.
.
.
.
지역 변수
현재 스택 포인터

  이와 비슷한 형태를 띄고 있기 때문에 만약 데이터를 읽는데 있어 return 될 주소의 코드가 다른 정보로 뒤 덮어씌워진다면 어떠한 문제점이 생길까요? Process 함수를 호출한 뒤, main 함수로 다시 돌아가지 않고, 어떠한 특정 함수로 호출이 될 수 있다는 점이 문제입니다.
  이 게 만약 Linux, Unix 쪽의 텔넷 터미널 쪽으로 접속되었을 때 수행이 되는 코드라고 생각을 해 봅시다. 그럼 악의적인 목적을 가진 사용자가 Telnet Control 소켓으로 일반적인 키보드로는 입력할 수 없는 데이터를 전송하여 return 코드를 덮어씌워버릴 수 있지 않을까요? 만약 그렇게 된다면 특정 커널 코드로 return 주소를 수정할 수 있고, 그로 인해 사용자의 권한이 관리자의 권한으로 지정되게 될 지도 모르겠죠.
  그런데 이러한 코드가 저런 부분만 해당 되느냐 하면 그것은 또 아닙니다.

strcpy.cpp (Language : cpp)
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main( int argc, char **argv )
  5. {
  6.     char InputData[100];
  7.     std::string Input;
  8.    
  9.     std::cin >> Input;
  10.     strcpy( InputData, Input.c_str() );
  11.  
  12.     return 0;
  13. }

  위와 같은 코드일 경우 문제점이 생길 것 같다는 생각이 들지 않나요? 바로 strcpy라는 함수에 바운더리를 계산하는 부분이 없어서 그렇습니다. 입력된 문자열이 길다면 그냥 데이터를 뒤집어 씌운다는 점으로 인하여 잠재적인 보안의 위협적 요소를 가지게 된다는 점이 중요합니다. strcpy 함수의 내부 구현은 아마도 '\0', NULL 문자가 나올 때 까지 해당 Dest 문자열에서 Src 문자열 까지 복사를 하도록 구현이 되어있을 겁니다. 그리하여 문제점이 생길 수 있는 것이구요.
  그래서 strcpy 대신에 strncpy를 사용하도록 권고가 되었고, 이 것 또한 모자라서 VS.net 2005 이상 부터는 strcpy_s 를 사용하도록 기존 문자열 함수들은 디프리케이트 된 것으로 알 고 있습니다. 사용하지 말라고 비권고까지 시켜버렸는데 굳이 사용할 이유는 없겠죠?
  책을 더 읽어서 유용한 정보가 있으면 더 올려보도록 하겠습니다. 이러한 보안요소는 지켜가며 코딩을 해야 겠다는 생각이 줄줄 드는군요^^;
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

OpenMP 라고 아십니까?? (0)2008/07/27
심심해서 구현해본 그래픽 요소 (0)2008/07/03
Child Window Mouse Message 문제. (0)2008/07/01
GDI+ 사용 시 Smart Pointer 란?? (0)2008/04/12
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/04/27 23:57 2008/04/27 23:57
TAG Secure, 버퍼 오버플로우, 보안
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/57

댓글을 달아 주세요

GDI+ 사용 시 Smart Pointer 란??

Programming Tip 2008/04/12 22:59 귀차니스트

  윈도우즈 프로그래밍을 해보셨던 분이라면 GDI라는 것은 한 번쯤 들어보셨을 겁니다. 바로 Graphics Device Interface의 준말입니다. 단어 그대로 Graphic에 관련된 루틴들이 들어있는 부분이죠. 그런데 사실 이 GDI라는 것이 속도는 무척 빠른게 맞지만, 보기보다 사용하기엔 엄청 불편합니다. 왜냐구요??

  1. HDC hdc;
  2. PAINTSTRUCT ps;
  3. HPEN MyPen, OldPen;
  4.  
  5. LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
  6. {
  7.     switch(iMessage) {
  8.     case WM_PAINT:
  9.         hdc=BeginPaint(hWnd,&ps);
  10.        
  11.         MyPen = CreatePen(PS_SOLID, 5, RGB(0,0,255));
  12.         OldPen = (HPEN)SelectObject(hdc, MyPen);
  13.         Rectangle(hdc,50,50,300,200);
  14.         SelectObject(hdc, OldPen);
  15.         DeleteObject(MyPen);
  16.        
  17.         EndPaint(hWnd,&ps);
  18.         return 0;
  19.     case WM_DESTROY:
  20.         PostQuitMessage(0);
  21.         return 0;
  22.     }
  23.     return(DefWindowProc(hWnd,iMessage,wParam,lParam));
  24. }
  25.  

  보시다시피 단순한 펜 하나를 그리려고 해도 실질적으로 불편한 점이 엄청 많습니다. 객체를 빌려오고, 반환하고, 이런 코드 치고 싶을리는 없을겁니다.
  대신 GDI+ 이러한 GDI 개체들을 Class Wrapping 하여서 엄청 편하고, 이해하기도 쉽다는 장점이 있습니다. 다만 트레이드 오프라고 대신 단점이 없을 수는 없죠. 단점은 속도가 GDI에 비해서는 속도가 약간 느립니다. 하지만 요새 컴퓨터 속도에 따라서는 감수할 수 있을 정도의 속도감소이기 때문에 괜찮다고 생각이 듭니다.

GdiPlus.cpp (Language : cpp)
  1. void OnPaint(HDC hdc)
  2. {
  3.      Graphics G(hdc);
  4.      Pen P(Color(255,0,0),5);
  5.  
  6.      G.DrawRectangle(&P,110,10,90,90);
  7. }
  8.  
  9.  

  사각형을 그리는 비슷한 역할의 코드임에도 불구하고, 무척 간단한 코드로 변하게 됩니다. 사실 보기만 해도 편하지 않나요?? 그런데 GDI+에도 한가지 보시면 불편하다? 라고 느낄 수 있는 부분이 있습니다.

FromFile.cpp (Language : cpp)
  1. void OnPaint(HDC hdc)
  2. {
  3.      Graphics G(hdc);
  4.      Image *Img;
  5.      Img=Image::FromFile(_T("Test.bmp"));
  6.  
  7.      G.DrawImage(Img,0,0);
  8.      delete Img;
  9. }
  10.  

  대표적으로 Image 클래스의 경우 FromFile같은 경우 메모리 해제를 따로 해주어야 하는 점이 존재합니다. 그래서 delete 로 개체를 삭제해야 하는 점이 존재하죠. C++ 에서 아시다시피 delete 라는 게 필요하다면 코드 실행 도중의 예외로 인한 catch 라던가 그런 부분쪽에 delete 코드를 모두 넣어 주어야한다는 점이 존재하죠. 그렇게 되면 코드가 무척 지저분해 집니다.

Boost.cpp (Language : cpp)
  1. #include <boost/shared_ptr.hpp>
  2.  
  3. void OnPaint(HDC hdc)
  4. {
  5.      Graphics G(hdc);
  6.      boost::shared_ptr< Image > Img( Image::FromFile(L"Test.bmp"));
  7.  
  8.      G.DrawImage(&*Img,0,0);
  9. }

  만약 boost 에 존재하고, C++ 새 표준에 추가된 TR1의 smart pointer를 사용해보면 어떨까요? 리소스를 어차피 객체화 할거면 이름 그대로의 영리한 Pointer를 사용하여 삭제가 될 수 있으니 코드도 지저분해지지 않는 일석이조의 효과를 누릴 수 있겠죠.
  물론 거의 기본 클래스로 알고 시작하는 smart pointer다 보니 대부분 알고 계실것 같지만, 아닌 분도 있고 그냥 기록 해두는 의미도 있고 해서 올렸는데. 나쁘지는 않겠죠^^? 그럼 오늘도 즐거운 하루 되세요~

참조 사이트 : http://www.winapi.co.kr
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming Tip" 분류의 다른 글

OpenMP 라고 아십니까?? (0)2008/07/27
심심해서 구현해본 그래픽 요소 (0)2008/07/03
Child Window Mouse Message 문제. (0)2008/07/01
버퍼 오버플로우, 오버런이란?? (0)2008/04/27
Com Library in C++ Builder - C++ 빌더에서 Com 라이브러리, .Net라이브러... (0)2008/03/29
2008/04/12 22:59 2008/04/12 22:59
TAG boost::shared_ptr, C++, GDI
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/49

댓글을 달아 주세요

◀ 이전페이지 1 2 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (110)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (24)
  • Intel 64 And IA32 Arch.... (2)
  • 한게임 자동테트리스 Ve.... (24)

최근에 달린 댓글

  • 다운어덯게 받아요. difl 2008
  • 멋있네요 ㅎㅎ. 준호씨 2008
  • ^^; 그러셨군요.. 사실 동영.... 귀차니스트 2008
  • ㅋㅋ 속도 튜닝의 무서움 ㅜ.... 귀차니스트 2008
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)

태그목록

  • Secure
  • Code
  • Image Processing
  • smart Pointer
  • 유니코드
  • Builder
  • ACM
  • 공백
  • 재귀적합성
  • LGT
  • Parent
  • Linux
  • 디코드
  • 보안
  • 폰트
  • 컬러체험단
  • ostreambuf_iterator
  • Raw
  • FreeType
  • std::copy
  • Warcraft III
  • Application.Run
  • TShell
  • Borland
  • 병렬
  • 뻘글
  • boost
  • 계발
  • 예외
  • HTML

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net