|
최장민 님이 쓰신 글 :
: 안녕하세요~
:
: 오늘 리스트뷰에서 데이타를 써넣을때만 프로그램이
: 멈추는걸 한참 고민하다가 우연히
: 저 코드를 삽입한 후로는 프로그램이 멈추질 않고
: 지가 할 작업을 잘 하는데
:
: 대체 저놈이 하는 기능은 뭔가요?
:
: 아시는분은 간략한 설명좀 해주세요~
임펠리테리입니다.
Win32하에서는 모든 작업이 메시지에 기반해서 처리되는데, 이런 이유로 한 쓰레드가 멈추지 않고
계속 작업중이거나 혹은 블락(block)되는 입력함수 때문에 입력을 기다리고 있는 상태가 되면
계속 입력되는 메시지들을 더 이상 처리하지 못하고 메시지 큐에 계속 쌓아놓게 됩니다.
이 상태가 되면, 아무리 사용자가 마우스로 윈도우를 끌려고 하든 혹은 윈도우에 있는 버튼 등의
컨트롤을 누르려고 하든, 어떤 경우에도 윈도우는 반응을 하지 못합니다.
만약 이렇게 논리적으로 블락된 쓰레드가 어플리케이션의 메인 쓰레드(디폴트 쓰레드, 그러니까
어플리케이션을 실행시키면 동작하는 쓰레드)일 경우라면 그 쓰레드에 속한 모든 윈도우들이
더이상 응답하지 않습니다.
"[응답없음]" 등으로 나타나는 상태가 바로 이런 경우죠.
이렇게 입력을 받지 않는 상태는, 사실 정상적으로 동작하고 있을 때도 있지만, 흔히는 프로그램이
예상치못한 무한루프에 빠져서 허우적대고 있는(?) 경우에 자주 나타납니다. 한번쯤은 당해보셨을
테니 아시겠지만, 요런 꼬락서니를 보고 있노라면 누구라도 상당히 불쾌합니다.
물론 프로그램이 "죽었다" 라고 말하는 상태와는 다릅니다. 루프를 빠져나와서 다시 메시지큐에
쌓인 메시지들을 처리하면 정상동작하게 되죠. 하지만 논리적인 버그에 의해 무한루프에 빠지게 된
경우라면 결코 원상회복되지 않고, 그래서 아주 죽어버린 거나 다름없는 상태가 됩니다.
이런 바보같은 "응답없음" 상태를 피하기 위한 코드가 바로 Application->ProcessMessages()
입니다. 이 함수의 역할은 아주 간단합니다. 메시지큐에서 PeekMessage() API 함수로 메시지들을
읽어와서 직접 처리해주는 동작을 하죠. 그러므로 메시지가 계속 입력되어 쌓이더라도, 이
Application->ProcessMessages() 함수를 실행할 때마다 쌓였던 메시지들이 한번에 주루룩 처리가
됩니다. 그래서 시간이 많이 걸리는 루프 코드의 중간에 이 코드를 넣어주면 마우스나 키보드 등의
각종 메시지들에 반응할 수 있게 되어 "응답없음" 상태를 피할 수 있게 되는 겁니다.
하지만, 이 Application->ProcessMessages() 함수를 멀티쓰레드 환경에서 사용하는 것은 별개의
문제입니다. 예상치 못했던 버그가 나타날 수도 있습니다. 이에 대한 언급은 다음에 다시 하도록
하지요.
그럼 참고하시길...
|