최근에 받은 트랙백

글 보관함

calendar

      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  

Windows

2009/06/23 19:50 | Posted by 머리
In a graphical Microsoft Windows-based application, a window is a rectangluar area of the screen where the application displays output and receives input from the user.
- Microsoft Windows 기반의 그래픽 application에서 'window'는 결과물을 표시하고 사용자로부터 입력을 받는 스크린의 사각 영역이다.
Therefore, one of ther first tasks of a graphical Windows-based application is to create a window.
- 그러므로 Windows기반의 그래픽 application의 첫번째 작업은 'window'를 생성하는 것이다.

A window shares ther screen with other windows, including those from other applications. Only one window at a time can receive input from ther user.
- 다른 application들을 포함해서, 'window'는 다른 'window'와 스크린의 영역들을 공유한다. 사용자로부터의 입력은 오리지 하나의 'window'만 받을 수 있다.
The user can use the mouse, keyboard, or other input device to interact with this window and the application that owns it.
- 이 'window'와 그것을 소유한 application과 사용자는 마우스,키보드 등의 장치들로 상호 작용할 수 있다.

About Windows

This topic describes the programming elements that applications use to create and use windows; manage relationships between windows; and size, move, and display windows.
- 이 주제는 응용프로그램이 'window'들을 생성,사용, 다른 'window'들과의 관계 관리, 'window'들의 크기조정, 이동, 표시를 위한 프로그래밍 요소들을 기술한다.

Desktop Window

When you start the system, It automatically creates the desktop window. The desktop window is a system-defined window that paints  the background of the screen and serves as the base for all windows displayed by all applications.
- 당신이 시스템을 시작할 때, 시스템은 자동적으로 'desktop window'를 생성한다. 'desktop window'는 화면에 배경 화면을 그리고 모든 application들이 표시하는 'window'들의 기반을 제공해 준다.

The desktop window uses a bitmap to paint the background of the screen. The pattern created by the bitmap is called the desktop wallpaper.
- 'desktop window'는 바탕 화면을 그리기 위해 비트맵을 이용한다. 비트맵이 만드는 패턴을 'desktop wallpaper'이라고 한다.

-계속-
저작자 표시
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG AIP, MSDN, Windows

비동기 I/O - 그 첫번째

2009/06/12 19:57 | Posted by 머리
  오랫만의 글이다. 프로그램을 사용하다 보면 그런 경우가 있을 것이다. 용량이 큰 파일을 읽게 되면 시간이 너무 오래걸려 급기야 '응답 없음'으로 변해 버리는 경우. 보통 이런 경우는 오래 기다리면 해결이 되곤 한다. 나는 이런 일을 겪을 때 마다 '비동기 I/O'라는 것을 생각하곤 한다. 그래서 한번 이 주제를 가지고 이야기 해 보고자 한다.
  자, 우선 앞선 상황을 한번 분석해보자. 용량이 큰 파일의 로딩 시간이 오래 걸려서 '응답 없음'상태까지 가버려 그 프로그램으로 아무런 작업도 할 수 없게 되는 상황이다. 원인은 '로딩' 그런데 왜 로딩을 하면 이런 상태에 빠져 버릴까? 한번 자세히 알아보자.
  로드를 하게 되면 아마 프로그램 내에서는 Load() 따위의 함수들이 호출될 것이다. 좀더 상황을 단순화 시키기 위해서 fscanf()를 호출했다고 하자. 아 물론 파일의 처음부터 끝까지이다. 이 함수는 호출후 파일을 모조리 읽을 때 까지는 함수가 return 되지 않는다. 즉 끝나지 않는다. 그리고 이 함수가 끝나지 않는 이상 함수 호출 다음의 명령은 실행되지 않는다.
  이런 경우는 일반적인 함수 호출에서도 마찬가지이다. 예를 들어 example(){while(1){}}이런 함수는 한번 실행되었다 하면 영원히 끝나지 않을 것이다. 이런 것과 비슷한 상황이다.  자, 그렇다면 fscanf()로 파일을 읽고 있는 도중에 얼마나 읽었는지에 대한 %비율을 출력하고 싶다면 어떻게 해야 할까? 대충 생각해 보면

1. 래퍼(wrapper)함수를 하나 만들어서 일정 단위로 쪼개서 fscanf로 읽으면서 얼마나 읽었는지 fscanf()함수가 끝날 때 마다 출력하는 방법.
2. 또다른 thread를 생성해서 상태를 확인하고 출력한다.

  2의 경우는 터무니 없는 방법이다. 왜냐하면 thread로 함수로 fscanf함수가 실행되는 것과 (거의)동시에 작업이 수행된다는것만 확보했을 뿐 fscanf의 내부 작업 상태는 확인할 방법이 없다. 1의 방법은 가능은 하겠지만 함수의 호출부담이 너무 크다(특히 입출력 함수의 경우 그래픽 출력 함수보다 더 느릴때가 있다.)
  이쯤에서 일반적인 함수 호출의 특성을 하나 알아보자. 이렇게 함수를 호출하게 되면 함수 호출이 끝날 때 까지는 다음 작업을 못하게 된다. 이런 상태를 Blocked 상태라고 한다. 그리고 이런 함수를 Blocking Function이라고 한다. 그리고 이런 Blocking Function을 이용한 I/O방식을 Synchronous I/O라고 한다. 
  이런 방식은 안정성은 줄 수 있지만 큰 용량의 경우와 빈번한 입출력이 있을 경우 불편하다. 특히 네트워크 쪽에서는 치명적이다.(ex 버퍼링) 그리고 무엇보다 CPU의 사용이 비효율 적이다. I/O의 경우 디스크에서 읽을 경우는 디스크가 부지런히 움직이고 네트워크의 경우에는 쉴새없이 데이터가 왔다갔다하고 할 지언정 중요한 CPU는 놀고 있다. (작업 관리자에서 한번 확인해 보아라.) 그래서 나타난 방식이 비동기 I/O(Ansynchronous I/O)이다. 앞으로 몇번에 걸쳐서 한번 이야기 해 볼 건데, 사전 지식도 조금 필요하기에 조금 천천히 이야기 할 것이다.
저작자 표시
이올린에 북마크하기(0) 이올린에 추천하기(0)
  어제 _beginthreadex()함수를 호출하다가 이런일이 있었다. 예를 들면 대충 이러한 상황이였다.

class ex_Class  //예제 클래스
{
private:
  unsigned WINAPI ThreadProc(LPVOID lParam)  //스레드를 위한 함수
  {
    //코오드
  }
  void TestFunction();

}
  void ex_Class::TestFunction()
  {
    _beginthreadex(NULL,0,ThreadProc,...);//스레드 생성
  }


이러니 _beginthreadex부분에서 컴파일 에러가 났다.  이유는 ThreadProc가 올바르지 않는 호출이라고..
처음에는 왜 그런지 몰라서 한참 헤매다가 나중에 겨우 이유를 찾았다.(당시에 인터넷도 안되고 해서 로컬 MSDN으로 한참 고생했다.)


우선 ThreadProc는 &ex_Class:ThreadProc같은 형태로 인자를 넘겨야 한다. ex_Class의 멤버함수이므로 접근 한정자를 붙여 주고 포인터이므로 &를 붙여 준다.
다음으로ThreadProc는 static으로 설정해야 한다. 함수 포인터의 호출이기 때문에 어느 한 객체에 소속되지 않게 하기 위해서 static으로 선언해야 한다. 이때문에 함수 내에서 멤버의 접근을 하기 위해서는 다음과 같은 방식으로 접근하여야 한다.

static unsigned WINAPI ThreadProc(LPVOID lParam)
{
  ex_Class *cls = (ex_Class*)lParam;
  cls->(멤버) 접근;
}

이는 꼭 스레드호출만이 아니라 함수포인터와 관련된 부분에서 해야 하는 것이다. 이런 상황에서 이런 오류를 만나서 예시가 이렇게 되었을뿐, 다른 상황에서도 마찬가지이다.
으흠... 아직 배우고 공부해야 할게 많다.
저작자 표시
이올린에 북마크하기(0) 이올린에 추천하기(0)
이전 1 2 3 4 5 ... 49 다음