2012-11-19 62 views
0

我有一個窗體應用程序,基本上ping一個IP,然後返回一個圖像的工具提示,顯示rtt到該IP。Ping一段時間

我想要做的就是每隔20秒就有一次表單ping,以便表單和圖像發生變化。如果我可以得到這個工作,那麼我想知道如何存儲4 rtt,然後在工具提示中顯示4的平均值。

到目前爲止,表單只能ping一次,我玩過一個計時器,但我並不知道自己在做什麼。這是我的代碼到目前爲止。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net.NetworkInformation; 
using System.ServiceProcess; 
using System.Threading; 
using System.ComponentModel; 



namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     public void Form1_Load(object sender, EventArgs e) 
     { 
      Ping pingClass = new Ping(); 
      PingReply pingReply = pingClass.Send("10.209.123.123"); 
      label4.Text = (pingReply.RoundtripTime.ToString()); 
      //+ "ms"); 
      label5.Text = (pingReply.Status.ToString()); 



      if (Convert.ToInt32(label4.Text) > 0 && Convert.ToInt32(label4.Text) < 100) 
       this.pictureBox1.Load("greenLAT.png"); 

      if (Convert.ToInt32(label4.Text) > 100 && Convert.ToInt32(label4.Text) < 200) 
       this.pictureBox1.Load("yellowLAT.png"); 

      if (Convert.ToInt32(label4.Text) > 200 && Convert.ToInt32(label4.Text) < 1000) 
       this.pictureBox1.Load("redLAT.png"); 

      ToolTip tt = new ToolTip(); 
      tt.SetToolTip(this.pictureBox1, "Your current network delay is " + label4.Text + "ms"); 

      timer1.Interval = 1000; 
      timer1.Tick += new EventHandler(timer1_Tick); 
      timer1.Start(); 

     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      //MessageBox.Show("Timeout!"); 
      Refresh(); 



     } 


    } 
} 

回答

0

試試這個:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Globalization; 
using System.Net; 
using System.Windows.Forms; 
using System.Net.NetworkInformation; 



namespace DXWindowsApplication4 
{ 
    public partial class Form2 : Form 
    { 
     private readonly Timer _timer; 
     private readonly Ping _pingClass; 
     private readonly IPAddress _ipAddress; 
     private readonly int _timeout; 

     private Image _greenImage; 
     private Image _yellowImage; 
     private Image _redImage; 

     private int _pingCount; 
     private long _avgRtt; 

     public Form2() 
     { 
      InitializeComponent(); 
      IPAddress.TryParse("98.138.253.109", out _ipAddress); // yahoo.com Ip address 
      _timer = new Timer(); 
      _timeout = 3000; 
      _pingClass = new Ping(); 
      _pingClass.PingCompleted += PingClassPingCompleted; 
     } 

     void PingClassPingCompleted(object sender, PingCompletedEventArgs e) 
     { 
      RefreshPing(e.Reply); 
     } 

     public void FormLoad(object sender, EventArgs e) 
     { 
      _timer.Tick += TimerTick; 
      _timer.Interval = 4000; 
      _timer.Start(); 
     } 

     private void TimerTick(object sender, EventArgs e) 
     { 
      _pingClass.SendAsync(_ipAddress, _timeout); 
     } 

     private void RefreshPing(PingReply pingReply) 
     { 
      label4.Text = (pingReply.RoundtripTime.ToString(CultureInfo.InstalledUICulture)); 
      label5.Text = (pingReply.Status.ToString()); 

      _avgRtt = (_avgRtt * _pingCount++ + pingReply.RoundtripTime)/_pingCount; 

      if (Convert.ToInt32(label4.Text) > 0 && Convert.ToInt32(label4.Text) < 100) 
      { 
       SetImage(pictureBox1, Images.Green); 
      } 

      if (Convert.ToInt32(label4.Text) > 100 && Convert.ToInt32(label4.Text) < 200) 
      { 
       SetImage(pictureBox1, Images.Yellow); 
      } 

      if (Convert.ToInt32(label4.Text) > 200 && Convert.ToInt32(label4.Text) < 1000) 
      { 
       SetImage(pictureBox1, Images.Red); 
      } 

      ToolTip tt = new ToolTip(); 
      tt.SetToolTip(pictureBox1, "Your average network delay is " + _avgRtt + "ms"); 
      Refresh(); 
     } 

     private void SetImage(PictureBox pBox, Images images) 
     { 
      switch (images) 
      { 
       case Images.Green: 
        if (_greenImage == null) 
        { 
         _greenImage = new Bitmap("greenImage.png"); 
        } 

        pictureBox1.Image = _greenImage; 
        break; 
       case Images.Yellow: 
        if (_greenImage == null) 
        { 
         _yellowImage = new Bitmap("yellowImage.png"); 
        } 

        pictureBox1.Image = _yellowImage; 
        break; 
       case Images.Red: 
        if (_redImage == null) 
        { 
         _redImage = new Bitmap("redImage.png"); 
        } 

        pictureBox1.Image = _greenImage; 
        break; 
       default: 
        throw new InvalidEnumArgumentException("invalid enum name"); 
      } 
     } 
    } 

    internal enum Images 
    { 
     Green, 
     Yellow, 
     Red 
    } 
} 
+1

你在UI線程做平,所以你阻塞UI線程平安的持續時間。 – Servy

+0

哇!這個工作,現在我怎麼可以記錄一個特定的數字可以說10 rtt的,然後顯示平均內的工具提示>?非常感謝你的幫助! – user1836162

+0

@Servy它只是想法,而不是真正的代碼。它離很好的代碼很遠。 –