안녕하세요.!! 델초보입니다..
다름이 아니오라 ICMP 컴포넌트를 사용해 Ping을 하는 프로그램을 구현
했습니다.((델파이 데몬에 있는 예제를 참고하여)
문제는 쓰레드 객체를 생성해 리스트 뷰에 등록된 만큼 의 IP를 핑을 하는 것
입니다. 리스트 뷰 상에 뿌려진 IP 수대로 핑을 다하는데...이걸 Timer를 주어
일정한 시간을 두고 다시 시간이 되면 핑을 다시 하려 하니 에러가 납니다.
원체 처음 테스트 할때 부터 불안정한 소스여서...ㅜ.ㅜ
Thread는 처음 사용해보거든요..!!
아래는 소스 내용입니다.
고수님들께서 보시고 초보인 저에게 가르침을 주십사하고 이렇게 글을 올립니다.
아래 소스가 첨부터 잘못 되었다면 확실히 지적을 하여 주십시요..!!ㅜ.ㅜ
별거 아닌거 같지만 저에겐 너무도..지금 힘드네요..!!ㅜ.ㅜ
일주일째....이러구 있으니까요..서두가 너무 길었습니다.
부탁좀 드리겟습니다......!!
=====================================================================
uICMPTd.Pas (TThread Object)
=====================================================================
procedure ICMPThread.Execute;
var
iFindRelay : Integer;
begin
for iFindRelay := 0 to Form1.ListView1.Items.Count-1 do
begin
Form1.ICMP.Host := Form1.ListView1.Items[iFindRelay].Caption;
Form1.ICMP.Ping;
end;
end;
=====================================================================
uMain.Pas
=====================================================================
var
Form1: TForm1;
iFindRelay : Integer;
iPrevRelay : Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ListItem : TListItem;
begin
ListItem := ListView1.Items.Add;
ListItem.Caption := Edit1.Text;
ListItem.SubItems.Add(Edit2.Text);
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
ListItem.SubItems.Add('');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
try
NewThread := ICMPThread.Create(False);
Timer1.Enabled := True;
// NewThread.OnTerminate := ICMPThreadDone;
except
NewThread.Free;
end;
end;
procedure TForm1.ICMPThreadDone(Sender: TObject);
begin
NewThread.Free;
end;
procedure TForm1.ICMPReply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
var
sTime : String;
i : Integer;
begin
with ListView1.Items do
begin
Item[iFindRelay].Caption := AReplyStatus.FromIpAddress;
Item[iFindRelay].SubItems.Strings[0] := IntToStr(AReplyStatus.BytesReceived) + 'bytes';
Item[iFindRelay].SubItems.Strings[1] := 'icmp_seq= ' + IntToStr(AReplyStatus.SequenceId);
Item[iFindRelay].SubItems.Strings[2] := 'ttl = ' + IntToStr(AReplyStatus.TimeToLive);
Item[iFindRelay].SubItems.Strings[3] := 'time ' + sTime;
Item[iFindRelay].SubItems.Strings[4] := IntToSTr(AReplyStatus.MsRoundTripTime);
end;
iPrevRelay := iFindRelay;
Inc(iFindRelay);
if iFindRelay > ListView1.Items.Count-1 then Exit;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
NewThread := ICMPThread.Create(False);
end;
end.