제가 바보같은 실수를 했군요..ㅡ.ㅡ
Unlocklist() 위치가 잘못되었습니다.
흑흑 님이 쓰신 글 :
: 타이머 에서 for문 돌리셨군요..
: 상관은 없구요..
:
: for문 동안은 당연히 cpu 100% 잡아 먹으꺼구요...
: 약간의 지연 딜레이만 넣어주시면 될꺼 같은데요...
: break;
: }
: }
: }
:
: TCPServer->Contexts->UnlockList();
: ::Sleep(1); // Sleep 값은 적당히 넣으세요.. 밀리세컨드 단위임..
:
: }
: }
:
: Sleep 시간만큼 cpu에 시간을 돌려줌...
: 오래 돌리는게 아니면 상관없다라고 생각이 들지만...
: 100% 잡아먹으면 기분상 문제있는 프로그램같이 보이기 때문에 그냥 Sleep 넣어주세요.
:
: 용맨소녀 님이 쓰신 글 :
: : 아래와 같이 클라이언트가 접속 한 후 5분이 지나면 자동으로 접속을 끊도록 구현하려는데요..
: :
: : 아래 루틴이 실행되면 서버의 CPU사용률이 100%로 되는 것 같습니다. 패킷이 오고가는건 되는 것 같습니다만.. 원인과 해결책이 무엇일까요?
: :
: : 별도의 쓰레드를 쓰는 것은 없고요.. 접속하고 패킷 하나 서버로 보내고 그걸로 끝입니다. 패킷을 보내고 접속을 끊어야 하는데, 안끊기는 경우가 간혹 있어서 일정시간이 지나면 서버차원에서 자동으로 접속을 해제하려고 하는거거든요..
: :
: : 접속을 해제할 클라이언트 판별은 접속시 Connection의 Tag에 카운트를 매겨서 구현하고 있습니다.
: :
: :
: : void __fastcall TWin_Main::Timer_DisconnectTimer(TObject *Sender)
: : {
: : DWORD Timer;
: : TIdContext *lpContext;
: :
: : if(!Timer_Disconnect->Enabled)
: : return;
: :
: : Timer = GetTickCount();
: :
: : for(int i = 0; i < MAX_PLAYER; i++)
: : {
: : if(stPlayer[i].Timer == 0)
: : continue;
: :
: : // 타이머 오류 교정
: : if(Timer < stPlayer[i].Timer)
: : stPlayer[i].Timer = Timer;
: :
: : // 시간이 지났다.
: : if(Timer - stPlayer[i].Timer > DISCONNECT_TIMER)
: : {
: : TList *LockList = TCPServer->Contexts->LockList();
: :
: : for(int j = 0; j < LockList->Count; j++)
: : {
: : lpContext = (TIdContext *)(LockList->Items[j]); // get client-object
: :
: : if(i == lpContext->Connection->Tag)
: : {
: : lpContext->Connection->Disconnect();
: :
: : break;
: : }
: : }
: : }
: :
: : TCPServer->Contexts->UnlockList();
: : }
: : }
: : |