이 방법은 저도 해 봤는데 안됩니다.
프로세스 자체가 이 무한 루프에 갇혀 있는 형국이라 무한 루프를 나가기 전에는 응답을 못하네요..
물론 메인 폼에 변수를 하나 설정하고 TCP Server에서 응답을 하면서 변수만 바꿔 주고 메인 폼에 타이머 같은거 하나 두어서 주기적으로 해당 변수를 체크하고 있다가 LOOP 함수 동작에 대해 처리하면 동작은 되겠지만 아무래도 뭔가 찝찝한 코딩처럼 느껴져서 문의를 드립니다.
방법이 정 없다면 어쩔수 없이 사용해야 겠지만 뭔가 좋은 방법이 있으면 좋겠습니다.
정성훈.해미 님이 쓰신 글 :
: 루프안에 Application->ProcessMessage() 를 사용해서 처리하는 것이
: 제일 간단한 방법일 것 같습니다.
:
: void __fastcall TForm1::LOOP()
: {
: while(true)
: {
: if(m_UserStop == true) break ;
: Sleep(100) ;
: Application->ProcessMessage(); // 추가
: }
: }
:
: 김시환 님이 쓰신 글 :
: : 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 같은 걸로 해결하는 방법이 있을까요?
|