WndProc() 함수는 그냥 일반적인 상태에서는 같은 하나의 쓰레드에서 실행되는것이 맞나요?
글쓴이: ko1205 / 작성시간: 목, 2013/05/23 - 9:33오후
테스트를 하다가 이해가 않되는것이 있어 질문 드립니다..
아래 코드는 그냥 기본 window를 띄우고 버튼하나 있는 코드입니다.
system을 windows로 하지 않고 console로 하여 main 함수에서 가짜 winMain함수를 호출하여 실행 됩니다.
간단하게 버튼 하나 있고 버튼을 누르면 다시 winMain 함수를 호출하게 하였습니다...
그런대 여기서 의문이 WndProc함수에서 winMain 함수를 호출하고 이함수가 끝나지 않았는데 처음 생성된 윈도가 활성화되고 버튼도 눌러집니다.
이게 정상적인건가요?? 정상적이라면 처음생성된 윈도우는 먹통이 되어있어야 하는것이 아닌가요??
breakpoint찍어보면 분명히 WndProc함수는 winMain함수를 호출하고 멈춰있다가 윈도우를 종료하면 아래로 내려가는대... 어떻게 기존 윈도우가 살아나는 걸까요?
혹시나 해서 WndProc 함수에 while 루프를 넣어서 돌려 보면 분명히 WndProc함수에서 걸리는걸 보면 다른 쓰레드에서 실행되는건 아닌것 같은대...
#include <Windows.h> #include <iostream> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int winMain(HINSTANCE); LPCTSTR lpszClass = TEXT("Particle Test"); bool bDone = false; HINSTANCE g_hInst; int main(int argc, char **argv) { HINSTANCE hInstance = GetModuleHandle(NULL); g_hInst = hInstance; winMain(g_hInst); } int winMain(HINSTANCE hInstance) { std::cout << hInstance << std::endl; HWND hWnd; MSG Message; WNDCLASS WndClass; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hInstance = NULL; WndClass.lpfnWndProc = WndProc; WndClass.lpszClassName = lpszClass; WndClass.lpszMenuName = NULL; WndClass.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&WndClass); hWnd = CreateWindow(lpszClass,lpszClass, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT,CW_USEDEFAULT,800,600, NULL,(HMENU)NULL,hInstance,NULL); ShowWindow(hWnd, SW_SHOWDEFAULT); while(!bDone) { while(PeekMessage(&Message,NULL,0,0,PM_REMOVE)) { if(Message.message == WM_QUIT) { bDone = true; }else{ TranslateMessage(&Message); DispatchMessage(&Message); } } } return (int)Message.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(iMessage){ case WM_CREATE: CreateWindowW(L"button",L"Click Me",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20,20,100,25,hWnd,(HMENU)0,g_hInst,NULL); return 0; case WM_COMMAND: std::cout << "WM_COMMAN" << std::endl; winMain(g_hInst); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd, iMessage, wParam, lParam)); }
Forums:
callback 의 뜻을 잘 생각해보시면...
callback 의 뜻을 잘 생각해보시면...
세벌 https://sebuls.blogspot.kr/
저도 콜백의 의미대로 생각 했는대...
저도 콜백의 의미대로 생각 했는대... 그렇다면 WndProc 함수 안에서 while loop를 걸어서 WndProc함수 를멈춰 놔도 똑같이 윈도우가 살아 나야 되는거 아닌가요?
그냥 WndProc 함수 내에서 쓰레드를 사용하지 않고 호출한 함수가 Loop에 빠지면 윈도우는 멈춰 버리잖아요??? 두가지 경우가 뭐가 틀린건지를 모르겠습니다.
위의 경우에도 따지면 WndProc에서 다시 winMain을 호출하고 그안에있는 메시지 Loop안으로 들어가 버리는거 아닌가요???
댓글 달기