특정 메세지가 들어오면 다른 작업을 수행하지 못하도록 하는 것이 목적이라면 무한 루프를 사용할 이유가 없을 것 같습니다.
void __fastcall TForm1::TCPServerExecute(TIdContext *AContext)
{
//AContext.Tag가 1로 변경되었거나 m_userstop이 아니면 해당 클라이언트의 다른 작업을 수행하지 않는다.
if ((AContext.Tag == 1) && (m_userstop = false) {
Sleep(100);
return;
}
TIdBytes ABuffer;
AContext->Connection->IOHandler->ReadBytes(ABuffer, -1, false);
int action = Parsing(ABuffer) ;
if( action == 1) AContext.Tag = 1;
}
김시환 님이 쓰신 글 :
: Indy TCP Server 를 사용하여 프로그램을 하고 있습니다.
: 외부 클라이언트에서 특정한 동작 요청이 있을 경우 서버 프로그램은 무한 루프 함수를 실행하게 됩니다.
:
: 그런데 이렇게 될 경우 이 서버가 다른 클라이언트 요청은 정상적으로 수행하는데 이 무한루프 함수를 요청한 클라이언트의 다른 요청은 이 무한루프를 빠져 나가기 전에는 수행을 못합니다.
:
: 아래 코드의 상황 입니다.
:
: void __fastcall TForm1::TCPServerExecute(TIdContext *AContext)
: {
: TIdBytes ABuffer;
: AContext->Connection->IOHandler->ReadBytes(ABuffer, -1, false);
: int action = Parsing(ABuffer) ;
:
: if( action == 1) LOOP() ;
: }
:
: void __fastcall TForm1::LOOP()
: {
: while(true)
: {
: if(m_UserStop == true) break ;
: Sleep(100) ;
: }
: }
:
: 결국 클라이언트의 요청이 완전히 동작 완료하기 전에는 동일한 클라이언트의 다른 요청에는 응답을 하지 못한다는 의미인데 이런경우 어떻게 해결하는 것이 좋을까요??
: Callback 같은 걸로 해결하는 방법이 있을까요?
|