|
NMUDP 에서 데이터를 읽을 때 보통 Read() 함수 계열을 쓸 때 타임아웃을 무한대로 해놓는 경우가
많은데 이 경우 윈도우에서 보내는 종료 메시지를 못받을 수 있습니다.
우선 NMUDP 를 메인쓰레드상에서 사용하신 건지 따로 쓰레드를 만들어서 쓰신 것인지 확인이 되어야
할 것 같고...
암튼... 타임아웃을 1초로 해서 Read() 를 호출하시면 간단히 해결될 문제로 보여집니다.
while()
{
UDP->Read( with 1000 ms timeout );
if( no data )
continue;
}
이런 방식으로 쓰시면 UDP Read 블럭킹 문제에서 탈출 하실 수 있습니다.
즐빌하세요. (@@a 왜 킬빌이 생각나는지...)
박종일 님이 쓰신 글 :
: 윈도우를 종료시켰을때.. 일반 프로그램들은 종료되면서 윈도우가 종료되게 됩니다.
: 이럴경우에는 자신의 프로그램에서도 윈도우의 종료메세지를 받아서 처리하게 된다고 알고 있습니다.
: 그래서 아래와 같이 종료메세지들을 찾아서 첨부해 줬는데..
: 일반적인 경우에는 정상적으로 종료가 잘 됩니다.
: 하지만 폼에 UDP를 쓰기위해서 NMUDP 컴퍼넌트를 하나 사용한 뒤에는 종료가 되지 않고 있습니다.
:
: 문제는 프로그램은 종료했습니다. 그런데 윈도우가 종료하지 않습니다.
: 그래서 다시한번 윈도우를 종료하면 되긴하는데.. 원천적으로 이문제를 해결할수 있는 방법이 없는지요.
:
: 아니면 추가적인 다른 코드가 필요할까요 ?
:
: void __fastcall WMQueryEndSession(Messages::TMessage &Msg);
: void __fastcall WMEndSession(Messages::TMessage &Msg);
: BEGIN_MESSAGE_MAP
: MESSAGE_HANDLER(WM_QUERYENDSESSION,TMessage,WMQueryEndSession);
: MESSAGE_HANDLER(WM_ENDSESSION,TMessage,WMEndSession);
: END_MESSAGE_MAP(TForm);
:
: void __fastcall Tfrm_ShutDown::WMQueryEndSession(TMessage &Msg)
: {
: Msg.Result=1; //종료 가능 ,
: //종료하지 못하게 하려면 Msg.Result=0;
: }
:
: //---------------------------------------------------------------------------
: //Windows 운영체제가 종료
: void __fastcall Tfrm_ShutDown::WMEndSession(TMessage &Msg)
: {
: if(Msg.WParam==true) {
: //Windows 운영체제 종료 시 처리할 작업 수행
: }
: Msg.Result=0;
: }
|