📄 unit3.~pas
字号:
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, BusinessSkinForm, StdCtrls, bsSkinCtrls, bsSkinBoxCtrls, Mask,
ExtCtrls, TeEngine, Series, TeeProcs, Chart;
Const WM_Test=WM_User+100;
type
Ttotal = class(TForm)
bsBusinessSkinForm1: TbsBusinessSkinForm;
Timer1: TTimer;
bsSkinPanel1: TbsSkinPanel;
bsSkinPanel3: TbsSkinPanel;
bsSkinPanel2: TbsSkinPanel;
Chart1: TChart;
bsSkinStdLabel7: TbsSkinStdLabel;
bsSkinStdLabel8: TbsSkinStdLabel;
bsSkinEdit6: TbsSkinEdit;
bsSkinStdLabel4: TbsSkinStdLabel;
bsSkinStdLabel9: TbsSkinStdLabel;
bsSkinEdit3: TbsSkinEdit;
bsSkinPanel4: TbsSkinPanel;
Chart2: TChart;
bsSkinPanel5: TbsSkinPanel;
bsSkinPanel6: TbsSkinPanel;
bsSkinStdLabel3: TbsSkinStdLabel;
bsSkinStdLabel5: TbsSkinStdLabel;
bsSkinEdit4: TbsSkinEdit;
bsSkinEdit1: TbsSkinEdit;
bsSkinStdLabel6: TbsSkinStdLabel;
bsSkinStdLabel11: TbsSkinStdLabel;
bsSkinEdit5: TbsSkinEdit;
bsSkinEdit7: TbsSkinEdit;
bsSkinPanel7: TbsSkinPanel;
bsSkinStdLabel1: TbsSkinStdLabel;
bsSkinStdLabel10: TbsSkinStdLabel;
bsSkinListBox1: TbsSkinListBox;
bsSkinListBox4: TbsSkinListBox;
bsSkinStdLabel13: TbsSkinStdLabel;
bsSkinEdit9: TbsSkinEdit;
bsSkinStdLabel14: TbsSkinStdLabel;
bsSkinStdLabel15: TbsSkinStdLabel;
bsSkinEdit10: TbsSkinEdit;
bsSkinEdit11: TbsSkinEdit;
bsSkinStdLabel16: TbsSkinStdLabel;
bsSkinStdLabel18: TbsSkinStdLabel;
bsSkinStdLabel19: TbsSkinStdLabel;
bsSkinStdLabel20: TbsSkinStdLabel;
bsSkinStdLabel21: TbsSkinStdLabel;
bsSkinStdLabel22: TbsSkinStdLabel;
bsSkinEdit8: TbsSkinEdit;
bsSkinStdLabel23: TbsSkinStdLabel;
Series1: TFastLineSeries;
LineSeries1: TFastLineSeries;
bsSkinStdLabel24: TbsSkinStdLabel;
bsSkinStdLabel25: TbsSkinStdLabel;
bsSkinStdLabel26: TbsSkinStdLabel;
bsSkinStdLabel27: TbsSkinStdLabel;
bsSkinStdLabel28: TbsSkinStdLabel;
bsSkinStdLabel29: TbsSkinStdLabel;
bsSkinEdit2: TbsSkinEdit;
bsSkinMemo1: TbsSkinMemo;
procedure Timer1Timer(Sender: TObject);
function findindex(str:string):integer;
procedure initialize(Sender:TObject);
private
{ Private declarations }
num:integer;
pre_send_total:int64;
pre_receive_total:int64;
pre_flux:int64;
total_delaytime:extended;
total_count:integer;
change_send_total:int64;
change_receive_total:int64;
sequence:integer;
pre_sequence:integer;
public
{ Public declarations }
procedure WMtest(var Message: TMessage); message WM_test;
end;
var
total: Ttotal;
implementation
uses unit1;
//function ReRecverInfo():boolean;Cdecl;external 'host.dll';
function ReSenderInfo(senderIP:pchar):boolean;Cdecl;external 'host.dll';
{$R *.dfm}
//初始化本窗口total的过程
procedure Ttotal.initialize(Sender:TObject);
var i:integer;
begin
//载入发送主机地址列表
if main.bsSkinListBox1.Items.Count>0 then
begin
self.bsSkinListBox1.Items.Clear;
self.bsSkinListBox4.Items.Clear;
for i:=5 to main.bsSkinListBox1.Items.Count-1 do
begin
self.bsSkinListBox1.Items.Add(main.bsSkinListBox1.Items.Strings[i]);
self.bsSkinListBox4.Items.Add('0.000000');
end;
end;
self.bsSkinEdit9.Text:=main.bsSkinListBox1.Items.Strings[0];
self.bsSkinEdit10.Text:=main.bsSkinListBox1.Items.Strings[1];
self.bsSkinEdit11.Text:=main.bsSkinListBox1.Items.Strings[2];
self.bsSkinEdit1.Text:='0';
self.bsSkinEdit4.Text:='0';
self.bsSkinEdit5.Text:='';
self.bsSkinEdit7.Text:='';
self.bsSkinEdit6.Text:='0';
self.bsSkinEdit3.Text:='0.681688';
self.bsSkinEdit8.Text:='0';
self.bsSkinEdit2.Text:='0';
self.Series1.Clear;
self.LineSeries1.Clear;
self.num:=0;//横坐标清0
self.pre_receive_total:=0;
self.pre_send_total:=0;
self.change_receive_total:=0;
self.change_send_total:=0;
self.pre_flux:=0;
self.total_delaytime:=0;
self.total_count:=0;
self.sequence:=0;
self.pre_sequence:=0;
end;
//发送统计请求,用timer1来控制统计速率
procedure Ttotal.Timer1Timer(Sender: TObject);
var i:integer;
lost_per:extended;
str:string;
pos:integer;
min:extended;
max:extended;
average_del:extended;
send_total:int64;
receive_total:int64;
flux:int64;
begin
//发送请求
for i:=0 to self.bsSkinListBox1.Items.Count-1 do
ReSenderInfo(pchar(self.bsSkinListBox1.Items.Strings[i]));
//ReRecverInfo(pchar(self.bsSkinListBox1.Items.Strings[1]));
//ReRecverInfo();
{
//读取接收数量、发送数量等数据
send_total:=strtoint64(self.bsSkinEdit4.Text);
receive_total:=strtoint64(self.bsSkinEdit1.Text);
//send_total:=1000;
//receive_total:=1000;
//调试
self.bsSkinMemo1.Lines.Add(inttostr(send_total)+'**'+inttostr(self.pre_send_total)+'**'+inttostr(receive_total)+'**'+inttostr(pre_receive_total)+'**'+inttostr(change_send_total)+'**'+inttostr(change_receive_total));
//处理一些特殊情况,如信息未收到或者信息迟到
if (send_total<=self.pre_send_total) then
begin
receive_total:=receive_total+change_receive_total;
send_total:=send_total+change_send_total;
self.bsSkinEdit4.Text:=inttostr(send_total);
self.bsSkinEdit1.Text:=inttostr(receive_total);
self.bsSkinEdit8.Text:=inttostr(strtoint64(self.bsSkinEdit4.Text)*(strtoint(self.bsSkinEdit9.Text)+42) div 1024);
end;
//显示总丢包率
if send_total<>0 then
begin
lost_per:=1-(receive_total/send_total);
//屏蔽掉丢包率为负值的情况,出现这种情况还是显示以前的值
if (lost_per>=0) and (lost_per<=1) then
str:= floattostr(lost_per*100)
else
str:= self.bsSkinEdit5.Text;
pos:=AnsiPos('.',str);
if (pos>0) and (length(str)> pos+6) then
str:=copy(str,1,pos+6);//取小数点后6位
//显示总丢包率
self.bsSkinEdit5.Text:=str;
end;
//显示实时丢包率
if (send_total-pre_send_total)<>0 then
begin
lost_per:=1-((receive_total-pre_receive_total)/(send_total-pre_send_total));
if (lost_per >= 0) and (lost_per <= 1) then
str:= floattostr(lost_per*100)
else
str:=self.bsSkinEdit6.Text;
end
else
str:=self.bsSkinEdit6.Text;
self.bsSkinEdit6.Text:=str;
flux:=strtoint64(self.bsSkinEdit8.Text);
//调试
self.bsSkinMemo1.Lines.Add(inttostr(sequence)+'**'+inttostr(flux)+'**'+inttostr(pre_flux));
//self.bsSkinMemo1.Lines.Add(inttostr(sequence+pre_sequence)+'**'+inttostr(flux)+'**'+inttostr(pre_flux));
//显示流量
if (flux-pre_flux>0) then
begin
//消息正常接收
if sequence-pre_sequence>0 then
begin
self.bsSkinEdit2.Text:=inttostr((((flux-pre_flux)*1000*8) div self.Timer1.interval) div (sequence-pre_sequence));
pre_sequence:=sequence;
end;
pre_flux:=flux;
end;
{else
begin
//消息因故晚到:保持bsskinedit2.text不变,同时按照上次的流量值bsskinedit2.text更新pre_flux
pre_flux:=flux+(strtoint64(self.bsSkinEdit2.Text)*self.Timer1.Interval div 8000);
end;}
//显示累积网络时延,total_count为0时不统计
if self.total_count>0 then
begin
average_del:=0;
for i:=0 to self.bsSkinListBox4.Items.Count-1 do
average_del:=average_del+strtofloat(self.bsSkinListBox4.Items.Strings[i]);
average_del:=average_del/self.bsSkinListBox4.Items.Count;
//average_del:=(average_del+self.total_delaytime*self.total_count)/(self.total_count+1);
//归整时延数据
str:= floattostr(average_del);
pos:=AnsiPos('.',str);
if (pos>0) and (length(str)> pos+6) then
str:=copy(str,1,pos+6);//取小数点后6位
self.bsSkinEdit7.Text:=str;
end;
//更新一些变量
total_count:=self.total_count+1;
total_delaytime:=average_del;
change_receive_total:=receive_total-pre_receive_total;
change_send_total:=send_total-self.pre_send_total;
pre_receive_total:=receive_total;
self.pre_send_total:=send_total;
//画曲线
if num > Chart1.BottomAxis.Maximum then
begin
min:= Chart1.BottomAxis.Minimum+1;
max:= Chart1.BottomAxis.Maximum+1;
Chart1.BottomAxis.SetMinMax(min,max);
min:= Chart2.BottomAxis.Minimum+1;
max:= Chart2.BottomAxis.Maximum+1;
Chart2.BottomAxis.SetMinMax(min,max);
end;
self.Series1.AddXY(num,strtofloat(self.bsSkinEdit6.Text));
self.LineSeries1.AddXY(num,strtofloat(self.bsSkinEdit3.Text));
num:=num+1;
end;
procedure Ttotal.WMtest(var Message: TMessage);
var pos:integer;
pos1:integer;
listboxindex:integer;
mes3:string;
mes1:string;
mes2:string;
str:string;
str1:string;
str2:string;
str3:string;
str4:string;
i:integer;
total_num:integer;
average_del:extended;
begin
//传过来的是一个字符串的头指针
mes1:=pchar(Message.WParam);//存放WParam
mes3:=pchar(Message.LParam);//读取序号或时延
self.bsSkinMemo1.Lines.Add('【'+mes3+'】***'+mes1+'***');
if mes1<>'' then
begin
pos:=AnsiPos('*',mes1);
if pos=0 then
begin
//不含"*",说明是发送端数据,mes1是发送端地址,mes2是时延+流量+序号
listboxindex:=self.findindex(mes1);
if listboxindex>-1 then
begin
//统计当前平均时延
mes2:=pchar(Message.LParam);
pos1:=AnsiPos('*',mes2);
str1:=copy(mes2,1,pos1-1); //流量
str2:=copy(mes2,pos1+1,length(mes2)-pos1); //时延+丢包率
pos1:=AnsiPos('*',str2);
str3:=copy(str2,1,pos1-1); //时延
str4:=copy(str2,pos1+1,length(str2)-pos1); //丢包率
str1:=copy(str1,1,length(str1)-6)+'.'+copy(str1,length(str1)-5,6);
self.bsSkinEdit2.Text:=str1; //流量
self.bsSkinListBox4.Items.Strings[listboxindex]:=copy(str3,1,length(str3)-6)+'.'+copy(str3,length(str3)-5,6);
str4:=copy(str4,1,length(str4)-4)+'.'+copy(str4,length(str4)-3,4);
self.bsSkinEdit5.Text:=str4; //丢包率
self.bsSkinEdit6.Text:=str4;
average_del:=0;
for i:=0 to self.bsSkinListBox4.Items.Count-1 do
average_del:=average_del+strtofloat(self.bsSkinListBox4.Items.Strings[i]);
average_del:=average_del/self.bsSkinListBox4.Items.Count;
//归整时延数据
str:= floattostr(average_del);
pos:=AnsiPos('.',str);
if (pos>0) and (length(str)> pos+6) then
str:=copy(str,1,pos+6);//取小数点后6位
self.bsSkinEdit3.Text:=str;
end;
end
else
begin
//含"*" 说明是接收端数据,mes1存放的是发送数量和接收数量,中间用*隔开
pos:=AnsiPos('*',mes1);
//sequence:=strtoint(mes3);
self.bsSkinEdit4.Text:=copy(mes1,1,pos-1);
self.bsSkinEdit1.Text:=copy(mes1,pos+1,length(mes1)-pos);
//self.bsSkinEdit8.Text:=inttostr(strtoint64(self.bsSkinEdit4.Text)*(strtoint(self.bsSkinEdit9.Text)+42) div 1024);
end;
end;
end;
function Ttotal.findindex(str:string):integer;
var i:integer;
begin
i:=0;
while i<self.bsSkinListBox1.Items.Count do
begin
if self.bsSkinListBox1.Items.Strings[i]=str then
begin
result:=i;
i:=self.bsSkinListBox1.Items.Count+1;
end
else
i:=i+1;
end;
if i=self.bsSkinListBox1.Items.Count then
result:=-1;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -