메신저를 만드는 중입니다. 비정상종료를 체크하기 위해서 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;