我在用delphi 编写ping 的程序以监测内部局域网的在线情况,我想编写一个可以自动检测,并且自动循环的小程序,不停的对局域网内部机器进行ping检测不断的更新“当前在线计算机”数据库,
请问各位大哥 如何能做到让程序不停的自动检测,还有就是在监测到完成一遍检测后再次不停的检测 程序稳定性的问题。
还有个问题就是我想让它在后台运行应该怎么做,高分请教!!
请问各位大哥 如何能做到让程序不停的自动检测,还有就是在监测到完成一遍检测后再次不停的检测 程序稳定性的问题。
还有个问题就是我想让它在后台运行应该怎么做,高分请教!!
会造成整个网络堵塞,对方会死机的!!!
所以必须控制时间!
//需要一个TCPClient组件,再NetFast里面
function TThreadPing.PingHost(Url:String):String;
var
Str:String;
i:Integer;
BefTime,AftTime:TTime;
Hour, Min, Sec, MSec: Word;
S:String;
R:real;begin
R:=0;
Str:=Url; if StrLower(Pchar(Copy(Url,1,3)))='htt' then
begin
Str:=Copy(Url,8,Length(Url));
Str:=Copy(Str,1,Pos('/',Str)-1);
end
else
if StrLower(Pchar(Copy(Url,1,3)))='ftp' then
begin
Str:=Copy(Url,7,Length(Url));
Str:=Copy(Str,1,Length(Str)-Pos(Str,'/'));
end;
for i := 1 to 4 do
with FTCPClient do
begin
BefTime:=Now;
RemoteHost:=Str;
RemotePort:='80';
try
Connect;
try
AftTime:=Now;
DecodeTime(AftTime-BefTime, Hour, Min, Sec, MSec);
R:=Sec+MsEc/1000;
finally
Disconnect;
end;
except on E: Exception do
R:=-1; end;
end;result:=Format('%.3f',[R]);
end;
var
buf : String;
begin
Buf := 'Hello';
IdIcmpClient1.host := 'pop.163.com';
IdIcmpClient1.Port := 110;
IdIcmpClient1.Ping(buf,1000);
Memo1.Lines.Add('After Ping : ' + buf);
end;procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
Memo1.Lines.Add( AReplyStatus.FromIpAddress);
end;
谢谢
记得需要一个放置TCPClient组件(它再NetFast页里面)
//需要一个TCPClient组件,再NetFast里面
function TThreadPing.PingHost(Url:String):String;
var
Str:String;
i:Integer;
BefTime,AftTime:TTime;
Hour, Min, Sec, MSec: Word;
S:String;
R,temp:real;begin
R:=0;
Str:=Url;
//下面一段不需要
//if StrLower(Pchar(Copy(Url,1,3)))='htt' then
//begin
//Str:=Copy(Url,8,Length(Url));
//Str:=Copy(Str,1,Pos('/',Str)-1);
//end
//else
// if StrLower(Pchar(Copy(Url,1,3)))='ftp' then
// begin
// Str:=Copy(Url,7,Length(Url));
// Str:=Copy(Str,1,Length(Str)-Pos(Str,'/'));
// end;
temp:=0;
for i := 1 to 4 do
with FTCPClient do
begin
BefTime:=Now;
RemoteHost:=Str;
RemotePort:='80';
try
Connect;
try
AftTime:=Now;
DecodeTime(AftTime-BefTime, Hour, Min, Sec, MSec);
temp:=temp+Sec+MsEc/1000;
finally
Disconnect;
end;
except on E: Exception do
R:=-1; end;
end;result:=Format('%.3f',[R:=temp/i]);
end;
我即时修改过的地方,还没有编译检查。但应该没错~~
可以这样定义
function PingHost(Url:String):String;但是因为在Ping的时候,为了不占用主线程的资源,
我用了一个线程来执行我的Ping操作。这个线程的定义如下: TThreadPing = class(TThread) { 声明线程类 }
private
FListView:TsuiListView;//这里定义了一个ListView
FTcpClient:TTcpClient;//这里定义了一个TcpClient
function PingHost(Url:String):String;
protected
procedure Execute; override;
procedure DoExec(FListView:TsuiListView); virtual; abstract;
public
constructor Create(Tcpclient:TTcpClient;lvServer:TsuiListView); { 线程构造器 }
end; TPing =Class (TThreadPing)
protected
procedure DoExec(FListView:TsuiListView); override;
end;var
P1:TPing;
procedure TPing.DoExec(FListView:TsuiListView);{ 执行线程的方法 }var
i:Integer;
begin for i:=0 to FListView.Items.Count-1 do
begin
FListView.Items.Item[i].Focused:=true;
FListView.Items.Item[i].SubItems[0]:=PingHost(FListView.Items.Item[0].SubItems.Strings[1])+'ms';
end; if Terminated then Exit;
end;procedure TThreadPing.Execute;{ 执行线程的方法 }
begin
DoExec(FListView);end;
constructor TThreadPing.Create(Tcpclient:TTcpClient;lvServer:TsuiListView);
begin
FListView:=lvServer;//这里的lvServer是你自己窗体上的ListView的Name
FTcpClient:=TcpClient;//这里的TcpClient是你自己窗体上的TcpClient的Name
//上面两句的意思就是把“窗体类”下面的两个控件,赋给“线程类”下面的两个变量
FreeOnTerminate := true;
inherited Create(false);
end;
procedure TFrmServer.btnTestPingClick(Sender: TObject);
begin
if Self.btnTestPing.Caption='测试速度' then
P1 := TPing.Create(TcpClient1,lvServer)
else
if Self.btnTestPing.Caption='停止测试' then
if P1.Suspended then P1.Resume else P1.Suspend;end;有什么问题就把你的代码贴上来。
不晓得是不是这个
还是有很多问题,要不你先把两段整个完整的代码都贴一下吧,
不好意思,我实在是 菜的很了,
就是那个TcpClient我的代码都贴出来了。
要说明的是我的窗体Name是FrmServer,
有一个Button,其Name是btnTestPing,
还有一个ListView,其Name是lvServerlvServer有两列,第一列是你要ping的机器名,第二列是其IP地址。
(怎么构造lvServer里面的值,不是本贴讨论的内容,
现在假设lvServer里面已经有若干数据了)类,及其属性、方法的定义我都贴出来了。
procedure DoExec(FListView:TsuiListView); virtual; abstract;
public
constructor Create(Tcpclient:TTcpClient;lvServer:TsuiListView); { 线程构造器 }
end; TPing =Class (TThreadPing)
protected
procedure DoExec(FListView:TsuiListView); override; 此处报错,
end;var
P1:TPing; 此处报错,.......dancedog(猪熔鸡) 大哥
能不能把整个程序完整的贴出来
老是有一些错误,
是一个第三方的控件,所以Delphi编译会提醒你,没有找到.dcu之类的错误。
是吧?你把TsuiListView改成TListView就可以啦~下面那个错误,也是因为这里的错误,连带引起的。修改这里,下面也就不会错啦。
就比如TForm的Name,我是FrmServer,而你如果没改的话,那就是Form1
我用了TsuiListView(第三方的控件),而你肯定是Delphi自带的TListview,
你不要胡乱一气拷贝,我不提倡这种做法。
可能是TsuiListView(第三方的控件) 的原因
你用普通的TListView代替就可以啦~~~~祝你成功!