WndProc() 함수는 그냥 일반적인 상태에서는 같은 하나의 쓰레드에서 실행되는것이 맞나요?

ko1205의 이미지

테스트를 하다가 이해가 않되는것이 있어 질문 드립니다..

아래 코드는 그냥 기본 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));
}
세벌의 이미지

callback 의 뜻을 잘 생각해보시면...

ko1205의 이미지

저도 콜백의 의미대로 생각 했는대... 그렇다면 WndProc 함수 안에서 while loop를 걸어서 WndProc함수 를멈춰 놔도 똑같이 윈도우가 살아 나야 되는거 아닌가요?

그냥 WndProc 함수 내에서 쓰레드를 사용하지 않고 호출한 함수가 Loop에 빠지면 윈도우는 멈춰 버리잖아요??? 두가지 경우가 뭐가 틀린건지를 모르겠습니다.

위의 경우에도 따지면 WndProc에서 다시 winMain을 호출하고 그안에있는 메시지 Loop안으로 들어가 버리는거 아닌가요???

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.