Microsoft MVP성태의 닷넷 이야기
C#과 WIN32 API 관계 질문드립니다. [링크 복사], [링크+제목 복사],
조회: 3503
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생님 안녕하세요.
UI 요소의 접근은 반드시 그 UI를 만든 스레드에서 : 2번째 이야기
( https://www.sysnet.pe.kr/2/0/12537#17061 ) 에서 해주신
답변을 이해하고자 윈도우 프로그래밍 책 한 권을 처음부터 끝까지 읽고
선생님의 예전 글들을 다시 읽으니까 새롭게 보이더고요.
그리고 "Winform은 결국 WIN32 API를 Wrapping해서 사용하는 것에 불구하다(?)."라는 느낌을 받았습니다.

인터넷, 책 찾아보고 해결 안 된 몇 가지 궁금사항을 선생님께 질문드리고자 합니다.

[질문 ①]
책이나 인터넷에서 WIN32 메시지 구동 구조를 설명할 때 보통 아래 두 가지 타입으로 설명하더라구요.
① System Message Queue → Application Message Queue → Message Loop → Window Procedure
② System Message Queue → Thread Message Queue      → Message Loop → Window Procedure
여기서 제가 궁금한 점은 Application Message Queue, Thread Message Queue 차이점입니다.
A라는 어플리케이션에 메시지 루프를 가진 UI 스레드가 하나라면
Application Message Queue와 Thread Message Queue가 동일하다고 볼 수 있지만
A라는 어플리케이션에 메시지 루프를 가진 UI 스레드가 2개라면
Application Message Queue와 Thread Message Queue는 같지 않다고 생각하는데
혹시 Thread Message Queue 여러 개를 묶어서 그냥 Application Message Queue라고 표현할까요?
(UI 스레드 2개를 만드는 방법은 https://www.sysnet.pe.kr/2/0/11287를 참고했습니다)


[질문 ②]
Application.Run()가 실행하는 메시지 루프에서 GetMessage 메서드를 통해
메시지 큐에서 메시지를 꺼낸다고 하는데
이때 메시지 큐는 threadCallbackList를 의미하나요?
public partial class Control {
    // ...[생략]...
    
    private Queue threadCallbackList;
    
    // ...[생략]...
}

[질문 ③]
새 프로젝트 템플릿 중에서 Windows Forms Application을 선택하면 폼 하나가 띄워집니다.
폼 위에 Button, TextBox, Label을 올려놓습니다.
폼 위에 올려놓은 3개의 컨트롤 Button, TextBox, Label은
Control 클래스를 상속받기 때문에
"질문 ②"에서 언급한 하나의 threadCallbackList 큐를 공유하는 게 맞을까요?

[질문 ④]
Message Loop를 구동하는 메인 스레드를 UI 스레드가 부르는데
이때 UI 스레드가 담당하는 메시지 큐는 어떤 경우에도 1개가 맞을까요?
(여기서 언급하는 큐는 시스템 큐가 아니라 질문 ①에서 언급한 Thread Message Queue
 혹은 Application Message Queue를 의미합니다.)








[최초 등록일: ]
[최종 수정일: 10/3/2023]


비밀번호

댓글 작성자
 



2023-10-04 09시53분
[답변 1] 혹시 2가지 방식으로 동작 구조를 설명한다는 책 또는 인터넷 문서를 알려주실 수 있을까요? 공식 문서에 보면,

About Messages and Message Queues
; https://learn.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues

"Application Message Queue"라는 문구가 한 번 나오는데 그것도 의미상으로는 Thread Message Queue에 해당합니다. 지금은 docs/learn 사이트가 많이 개편돼 예전 MSDN 시절의 문서가 사라져서 오히려 시스템 레벨의 내용을 찾기가 힘들어졌습니다. 언뜻 제 기억으로는 Thread Message Queue가 메시지의 종류에 따라 여러 개를 갖고 있으며, 아마도 그중의 하나가 Application Message Queue라고 불릴 수 있을 듯합니다. (마지막 의견은 공식적으로 확인된 사항이 아닙니다.)

[답변 2] GetMessage가 다루는 대상은 (공식 문서상으로는) Thread Message Queue입니다. 첨부한 Control 클래스의 소스 코드는 닷넷의 코드일 텐데, GetMessage는 닷넷의 존재를 알지 못합니다.

[답변 3] 1개의 스레드에서 생성한 Form, Button, TextBox, Label이 있는 것이고 그것은 동일한 Thread Message Queue를 공유합니다. (공유한다는 표현보다는, 한 개의 스레드 메시지 큐에 의해 동작한다는 것이 올바른 표현이겠군요.)

[답변 4] 답변 2에 따라 GetMessage는 해당 Thread와 연결된 메시지 큐를 대상으로 하기 때문에 1개가 맞습니다.
정성태
2023-10-04 09시40분
책 혹은 인터넷에서 Windows Message Queue를 설명할 때 사용하는 그림은 크게 2가지입니다.
Application Message Queue 그림을 사용하거나
혹은 선생님께서 말씀하신 Thread Message Queue 그림을 사용한 것입니다.

아래 블로그는 Application Message Queue 그림을 사용한 것입니다.
https://flylib.com/books/en/2.906.1.18/1/
https://webocreation.com/anatomy-of-a-windows-based-application/#gsc.tab=0
쉽게 배우는 MFC 윈도우 프로그래밍[김선우] 44, 45쪽도 위의 블로그와 동일한
Application Message Queue 그림을 사용해서 설명하고 있습니다.

API로 배우는 Windows 구조와 원리[야스무로 히로카즈] 56, 57쪽에는
Thread Message Queue 그림을 사용해서 설명하고 있습니다.

답변해 주셔서 정말 감사합니다.^^
한예지
2023-10-04 10시28분
Application Message Queue 그림, Thread Message Queue 그림 모두 완전히 동일한 그림입니다.
딱 한 가지 차이점은 Thread Message Queue 그림은
Application Message Queue 단어 대신 Thread Message Queue 단어를 사용했다는 것입니다.
한예지
2023-10-04 11시58분
인용하신 자료가 상당히 오래된 걸로 봐서, 당시에는 "Application Message Queue"로 명명한 듯합니다. 현재는 "Thread Message Queue"가 완전히 동일하게 그 그림의 역할을 하고 있으니 같은 것입니다.
정성태

... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
3700박성훈2/18/201611112시작하세요! C# 6.0 프로그래밍 105쪽 예제 질문 [1]
3699박성훈2/18/201610697공부 방향성 질문 [2]
3698강준2/16/201611296Entity Framework 에서 Select for Update 가 가능한가요??? [1]
3697ds2/16/201610852어느 정도 문법을 알고 나면 [6]
3695Bere...2/15/201613089호출당한 메서드가 호출한 메서드를 알 수 있는 방법이 일반적인 방법 말고도 있을까요? [2]
3693조영준2/11/201613787UWP 앱을 만들고 있습니다. 죄송하지만 몇 가지 질문 드립니다. [4]
3692후배2/8/201612779html/css/js를 이용한 winForm의 UI표현이 가능 한가요? [3]
3690김대석2/5/201611253문의 드립니다. [2]
3687허재영2/3/201612853web api 보안관련 질문입니다. [2]
3685조진우2/1/201612779메인 응용 프로그램에서 DLL을 실시간으로 접근하여 사용하는데 이것을 모니터링 할 수 있을 까요? [1]
3684나그네1/27/201612116안녕하세요..wcf 관련하여 질문있습니다. [4]파일 다운로드1
3683김태형1/25/201612407 안녕하세요 저작도서를 구매하려는데 한가지 문의 사항이 있어서 질문드립니다. [1]
3681이영균1/8/201614973IE브라우저 추가기능관리의 항목을 사용함으로 c#코드로 변경을 하려고 합니다. [8]
3680후배1/6/201615185추천할만한 소켓 라이브러리 있으신가요? [2]
3679초록물꼬기1/6/201614045Parallel.For 에서 동기화문제에 관한 질문입니다. [11]파일 다운로드1
3678김민우1/3/201612514IHS 오류에 대한 질문입니다. [2]파일 다운로드1
3677초록색우산12/31/201514089HTTP 통신 - WebClient 이용시 한글깨짐 현상 발생 [2]
3676서정열12/31/201512925안녕하세요 WebService SoapExtensionImporter 에 대해서 질문드립니다. [3]
3675차가워12/30/201511998윈폼, 폼인폼 상황에서 하위컨트롤 포커스 문제 [1]
3673Sung...12/24/201513045UWP예외 발생 : 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll) 해결방법 [2]
3672Sung...12/23/201512274global::System.Diagnostics.Debugger.Break();가 노랗게 표시될시 [2]
3671이상준12/22/201516489한글 키보드 입력에 대해서 질문이 있습니다. [3]
3670Sung...12/18/201513244UWP 주기적으로 신호를 보내고 클라이언트에서 신호가 오면 받는 프로그램을 하려고 합니다. [5]
3669다비드12/18/201511562인터넷 임시파일 삭제 관련 질문. [1]
3668김치사발면12/16/201511005템플릿이 자꾸 초기화? 되버리네요 [1]
3667김치사발면12/15/201510902템플릿 설정 추가 질문 [1]파일 다운로드1
... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...