Q&A

  • 비정상종료 체크방법....
메신저를 만드는 중입니다. 비정상종료를 체크하기 위해서 timer를 이용했
습니다. 서버쪽 부하를 줄일려고, 체크는 클라이언트측에서 하구요.
문제는 timer작동시 클라이언트가 약 50초 정도 버벅거립니다. timer interval
를 1분으로 한다고 해도 10초만 제대로 가동한다는 결론이져..
제 방법말고 다른 방법이 있을까 해서 글을 올려보내요..
indy클라이언트는 2개를 둬서 1개를 비정상종료체크만 하게 뒀구요.

//로그인할때 친구ID,IPPORT,접속유무를 받아서 array에 저장
user_cnt := 총 친구등록수
connect_cnt := 접속중인 친구수
setlength(frid_array,user_cnt);
setlength(frip_array,user_cnt);
setlength(frport_array,user_cnt);
setlength(frcheck_array,user_cnt);
  //배열입력
for j:=0 to user_cnt-1 do
begin
   frid_array[j] := 아이디
   frip_array[j] := IP
   frport_array[j] := PORT
   frcheck_array[j] := 접속유무(Y/N)
  end;

//비정상종료 체크
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i : integer;
begin
  if connect_cnt > 0 then //접속중인 친구가 있을경우에만 실행
  begin
    for i:=0 to user_cnt -1 do
    begin
      IdTCPClient2.Host := frip_array[i];
      IdTCPClient2.Port := strtoint(frport_array[i]);
      if frcheck_array[i] = 'Y' then
      begin
        try
          IdTCPClient2.Connect;
        except on Exception do
        begin
          IdTCPClient1.Host := server_ip;
          IdTCPClient1.Connect;
          IdTCPClient1.WriteLn('이눔 종료했대요..');
          //이부분에서 서버부하를 줄일려고 친구리스트를 다시 받질않고 작성
          frcheck_array[i] := 'N';  //접속 X
          friend_list_show(); //리스트작성함수 (treeview에 리스트작성)
        end; //except
        end; //try
        IdTCPClient1.Disconnect;
        IdTCPClient2.Disconnect;
      end; //if
    end; //for
  end; //if
end;
0  COMMENTS