(Win32 : WindowsProgramming-20) Thread Etc : MessageQueue

Posted by : at

Category : win32   WindowsProgramming


Thread Message Queue

  • Thread당 하나씩 메시지큐가 생긴다
  • 메시지 큐는 언제 생성되나
    • 정확히는 Thread에서 GUI관련 요소를 만들거나,
    • 메시지 큐가 필요한 함수를 사용시 생성이 된다.

메시지큐를 통하여 두 Thread상에 통신을 해보자

보통 메시지 통신을 SendMessge(), PostMessage()를 통해서 하는데
메시지를 받을 Thread에 메시지 queue가 없을 수 있어
메시지를 받았는지 못받았는지 확인할 수 있는 PostThreadMessage를 통해서 메시지를 보내보자

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include <process.h>

UINT __stdcall foo(void* p)
{
    // 이 Thread는 queue가 없다.
    while(1)
    {
        printf("foo\n");
    }
    return 0;
}

int main()
{
    UINT tid = 0;
    HANDLE h = (HANDLE)_beginthreadex(0, 0, foo, 0, 0, &tid);

    Sleep(1000);
    BOOL b = PostThreadMessage(tid, WM_APP + 100, 10, 20);

    printf("result : %d\n", b); // 0 : 실패
    return 0;
}

queue를 생성하는 Thread를 만들어 보자

UINT __stdcall foo(void* p)
{
    // 방법.1 - GUI요소 만들기
    HWND hwnd = CreateWindowEx(0, _T("button"), _T("ok"), WS_OVERLAPPEDWINDOW,
                0, 0, 300, 300, 0, 0, 0, 0);
    ShowWindow(hwnd, SW_SHOW);

    // or

    while(1)
    {
        // 방법.2 메시지 큐를 쓰기
        MSG msg;
        GetMessage(&msg, 0, 0, 0);

        if(msg.message == WM_APP + 100)
        {
            printf("메시지 도착 : %d, %d\n" msg.wParam, msg.lParam);
        }
        else if(msg.message == WM_APP + 200)
        {
            break;
        }

        printf("foo\n");
    }
    return 0;
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links