|
이건 큰 고민 안하고 안전하게 프로그램의 질을 높일 수 있는 괜찮은 코드입니다. 저도 종종 비슷하게 코딩하고요.
코드를 봤을 때, 이 코드의 작성자는 어떤 이유인지는 몰라도 폼이 닫힐 때 0.3초 정도 잠시 기다렸다 닫히길 바란 것이구요. 아마도 이 코드의 바로 앞이나 근방에 코드에 폼에 뭔가를 표시했을 것 같네요. 그 표시한 내용을 폼이 닫히기 전에 사용자에게 보여주려고 한 것일 거고요. 쉽게 예를 들자면, "폼이 닫힙니다" 이런 표시를 했을 수 있죠. 또 아래 Orange 님 말씀대로 통신 결과를 기다리려는 꼼수일 수도 있겠습니다.
그런데, 똑같이 0.3초를 지연시키더라도, 만약 별 고민 안하고 for 문 없이 간단하게 Sleep(300) 이렇게만 했을 경우, 0.3초 동안 지연되는 건 똑같습니다만 그 0.3초 동안 애플리케이션이 응답없음 상태가 됩니다. 윈도우에서 응답없음 상태란 애플리케이션의 윈도우들이 메시지에 반응하지 않는 상태가 상당 시간 유지되는 상태구요. 0.3초면 민감한 사용자라면 충분히 답답해할 수 있는 시간인데, 이 시간 동안 타이틀바를 잡고 이동한다든지 하는 동작도 전혀 반응을 안하는 거죠.
그래서 이렇게 응답없음 상태를 피하려면 가장 편안한 방법이 바로 보여주신 코드와 같이 for 문 안에서 Application->ProcessMessages();를 반복 호출하는 겁니다. 이 Application::ProcessMessages() 함수의 역할은, 말씀하신 대로 현재 윈도우에 대기중인 모든 윈도우 메시지를 처리하는 건데요. 더 정확하게는 윈도우 메시지 큐에 들어와있는 메시지들을 하나씩 차례로 Peek한 후 Handle 합니다.
즉 타이틀바를 잡고 이동시키는 경우 WM_MOVE를 비롯한 WM_SYSCOMMAND 등등의 메시지가 메시지큐에 들어올텐데, Application->ProcessMessages();를 호출하면 이 대기중인 모든 메시지가 처리되면서 윈도우 이동 등의 반응이 일어나게 됩니다.
장시간이 걸리는 for 문 안에서 Application->ProcessMessages();를 호출하는 것은 별 걱정과 고민 없이도 소프트웨어의 품질을 높이는 좋은 방법입니다. 다만 이 함수를 사용할 때 절대로 피해야할 몇가지 케이스가 있는데요. 그중 하나가, 쓰레드입니다. 디폴트 쓰레드가 아닌 서브 쓰레드 내에서는 절대로 이 함수를 써서는 안됩니다. 쓰레드가 주화입마를 하거든요. ㅋㅋ 기본적으로 서브 쓰레드에서는 프로그램의 UI와 관련된 동작을 하면 안되는데, Application->ProcessMessages();는 당연하게도 프로그램의 UI 상태를 읽고 쓰기 때문에 그렇습니다.
그럼...
식섭 님이 쓰신 글 :
: 전임자가 짜놓은 소스중에 formclose() 이벤트에서
:
: for( int i=0;i<3; i++)
: {
: Application->ProcessMessages();
: ::Sleep(100);
: }
:
: 이란 소스가 있더군요
:
: Application->ProcessMessages();
: 이란게 뭐하는함수인지 궁금하여 MSDN에서 검색해 보니
:
: 현재 진행중인 어플리케이션을 일시정시하고 메세지큐가 비어있을때까지 루프를 돌면서 메세지를 처리하는거같은데
:
: 저기서 왜 for문으로 3번이나 반복하는지 모르겠습니다 뒤에 Sleep(100)을 준거 보니 뒤늦게 들어오는 메세지가 있을지 모르니깐
:
: for()문을 돌리는건가요?
|