WinAPI PeekMessage (2)

CJB_ny·2022년 8월 24일
0

WinAPI

목록 보기
6/79
post-thumbnail

PeekMessage

메세지 유무와 관계없이 반환

현재 우리 프로그램이 메세지에만 반응할 수 밖에 없는 가장 큰 원인이

'GetMessage' 함수 때문.

'GetMessage'

메세지 큐에서 '메세지' 꺼내오는데
함수가 언제까지 대기를 하나
메세지 큐에 메세지가 들어올 때까지 대기함.

이것을 해결할려고 Timeer를 만들어서 프로그램이 멈추지 않게 했었음. (차선책)

'GetMessage'는 메세지가 없으면 아무것도 반환을 안하기 때문이다.

그래서 '메세지'가 있던 없던 반환을 하는 함수를 사용을 해야하지 않을까?

그래서 GetMessage말고 PeekMessage를 사용할 것이다.

옅? 엿보다.

PeekMessage의 경우 메세지 큐에 메세지가 있거나 없거나

대기하고 있을 이유가 없다.

없으면 없내? 하고 반환을 함.

있으면 있다고 반환하고..

마지막 옵션은 확인한 메세지가 있을 경우

그 메세지를 메세지 큐에서 제거를 할지 말지 결정.

제거한다고 해주어야한다.

근데 이게 while문의 조건으로 들어갈 수는 없다.

GetMessage의 경우 WM_QUIT이 false를 반환하기 때문에 들어갔던것이다. while문의 조건으로

다른 이벤트의 경우 true를 반환하니까 while의 조건으로 들어감.

그런데 PeekMessage는 메세지가 있든 없든 계속 반환하는데 이게

while문의 조건으로 들어갈 수 있나?

(애도 일단 T/F 반환함)

그런데 언제 T/F 반환하나?

=> 메세지 있으면 true, 없으면 false반환함.

그래서 구조가

이렇게 바뀔 것이다.

근데 하나 더 체크를 해야하는데 바로

67번째 줄 WM_QUIT일때를 먼저 체크를 해주어야한다.

이 구조가 지금 기존의 GetMessage와 같은 상황이다.

그래서 메세지 없는 경우

else로 없는동안 호출하게 해주어야한다.

비교시간 체크

메세지 발생하는 시간이랑 발생하지 않는 시간이랑 시간 비교 ㄱㄱ.

이렇게 체크를 해보도록 하자.

근데이거 이상하니까 다시

여기서 생각해보자.

일단 이렇게 해주도록 하자.

else 부분에서

비율을 구한다음에

float를 문자열로 반환하는 함수 swprintf_s 사용해서

윈도우에 띄우는 함수 SetWindowText를 사용해서 띄어보도록 하겠다.

뭐하는거임?

지금 보여주고 싶은게 메세지를 처리 하는 시간이 엄청나게 짧다는 것이다.

놀고있는 시간이 99%거 넘는다.

비동기

메세지 기반 방식은 현재 우리 윈도우에 포커싱이 되어있지 않으면

우리쪽으로 아예 메세지 큐가 들어오지를 않는다.

메세지가 발생했다는 것 조차 들어오지 않는다.

현재 '포커싱'되어있는 윈도우에게만 메세지 큐에 메세지를 넣어 줄 것이다.

근데, '비동기'함수를 사용하면 우리 프로그램과 어떤 '이벤트 처리'가 '동기화'가 안된다.

그냥 '절대적'으로 알아낼 수 있다.

백그라운드가 돌아서 윈도우에 포커싱이 되어있는지 안되어있는지 상관 없이.

프로그램실행하는 도중에 마우스 눌렸는지 안 눌렸는지 즉시 알아 낼 수 있다.

대신 이런 비동기함수를 사용할때 스스로 예외처리를 해주어야한다.

'포커싱'되어있지 않은 경우 특정 키를 눌려도 동작하지 않도록.

메세지 기반방식을 사용하지 않았기 때문에 언제든지 체크가 가능.

이런 메세지가 발생하지 않는 99%의 시간동안 게임을 수행할 것이다.

디자인 패턴(설계 유형)

뭔가 형태를 갖추고 설계하는 그런 패턴?

패턴은 유형.

사람 생각하는게 비슷해서 생각이랑 아이디어 비슷.

이러한 상황에서는 이러한 설계방식으로 해결을 한다.

이러한 경우에는 이런방법으로 해결을 하더라

이게 언어에 상관없이 '디자인 패턴'이 있는 것이다.

언어에 따라서 방식은 다를 것이다.

절대 몰라서는 안되는 패턴

싱글톤 패턴

C# 싱글톤?

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글