2012-01-24 2 views
0

Это передача файлов (клиент-сервер TCP розетки)рассчитать скорость отправки файла/сек в менее чем за секунду (без использования Thread.Sleep)

Приведенный ниже код показывает скорость передачи данных в секунду (кб/с) каждую секунду.

Я хочу показать скорость (rate/s) каждый раз, когда я отправляю данные клиенту. Как рассчитать скорость каждый раз (без использования thread.sleep(1000))?

private void timeElasped() 
    { 
     int rate = 0; 
     int prevSent = 0; 
     while (fileTransfer.busy) 
     { 
      rate = fileTransfer.Sent - prevSent ; 
      prevSum = fileTransfer.Sent; 
      RateLabel(string.Format("{0}/Sec", CnvrtUnit(rate))); 
      if(rate!=0) 
       Timeleft = (fileTransfer.fileSize - fileTransfer.sum)/rate; 
      TimeSpan t = TimeSpan.FromSeconds(Timeleft); 
      timeLeftLabel(FormatRemainingText(rate, t)); 
      Thread.Sleep(1000); 
     } 
    } 

ответ

0

в виде конструктора

Timer timer1 = new Time(); 
public Form1() 
{ 
    InitializeComponent(); 
    this.timer1.Enabled = true; 
    this.timer1.Interval = 1000; 
    this.timer1.Tick += new System.EventHandler(this.timer1_Tick); 
} 

или добавить его из панели инструментов и установить предыдущие значения

сумма отправленных байт должно быть публичным, так наш метод может получить его значение каждый второй

long sentBytes = 0;  //the sent bytes that updated from sending method 
long prevSentBytes = 0; //which references to the previous sentByte 
double totalSeconds = 0; //seconds counter to show total time .. it increases everytime the timer1 ticks. 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    long speed = sentBytes - prevSentBytes ; //here's the Transfer-Rate or Speed 
    prevSentBytes = sentBytes ; 
    labelSpeed.Text = CnvrtUnit(speed) + "/S"; //display the speed like (100 kb/s) to a label 
    if (speed > 0)    //considering that the speed would be 0 sometimes.. we avoid dividing on 0 exception 
    { 
     totalSeconds++;  //increasing total-time 
     labelTime.Text = TimeToText(TimeSpan.FromSeconds((sizeAll - sumAll)/speed)); 
     //displaying time-left in label 
     labelTotalTime.Text = TimeToText(TimeSpan.FromSeconds(totalSeconds)); 
     //displaying total-time in label 
    } 
} 

private string TimeToText(TimeSpan t) 
{ 
    return string.Format("{2:D2}:{1:D2}:{0:D2}", t.Seconds, t.Minutes, t.Hours); 
} 

private string CnvrtUnit(long source) 
{ 
    const int byteConversion = 1024; 
    double bytes = Convert.ToDouble(source); 

    if (bytes >= Math.Pow(byteConversion, 3)) //GB Range 
    { 
     return string.Concat(Math.Round(bytes/Math.Pow(byteConversion, 3), 2), " GB"); 
    } 
    else if (bytes >= Math.Pow(byteConversion, 2)) //MB Range 
    { 
     return string.Concat(Math.Round(bytes/Math.Pow(byteConversion, 2), 2), " MB"); 
    } 
    else if (bytes >= byteConversion) //KB Range 
    { 
     return string.Concat(Math.Round(bytes/byteConversion, 2), " KB"); 
    } 
    else //Bytes 
    { 
     return string.Concat(bytes, " Bytes"); 
    } 
} 
1

У вас есть два решения, чтобы сделать:

  1. над тем, сколько времени вы хотите взять среднюю скорость передачи данных?
  2. Как часто вы хотите обновить/сообщить о результатах?

Напомним, что текущая мгновенная скорость передачи не существует. Или, вернее, текущая мгновенная скорость передачи - это либо полная физическая скорость вашего сетевого интерфейса (например, 100 Мбит/с), либо нуль, что соответствует ситуациям «есть этот пакет, который отправляется/принимается прямо в эту микросекунду» и «линия простаивает ". Поэтому вам нужно усреднить.

В приведенном выше коде вы выбрали одну секунду как значение для (1) и (2). (1) и (2) равны, это простейший случай кодирования.

Я рекомендую вам выбрать более длительный период для (1). Усреднение только за одну секунду приведет к довольно резкой скорости передачи на всех, кроме самых плавных передач файлов. Рассмотрим, например, что Cisco IOS составляет по умолчанию более 5 минут и не позволяет настроить менее 30 секунд.

Для (2) вы можете продолжать использовать 1 секунду или, если хотите, еще менее одной секунды.

Выберите значение для (1), которое кратно значению, которое вы выбрали для (2). Пусть n be (1) делит на (2). Например, (1) составляет 10 секунд, (2) - 500 мс и n=20.

Создание кольцевого буфера с n записей. Каждый раз, когда (2) истекает, замените самую старую запись в кольцевом буфере на количество байтов, переданных с предыдущего истекшего времени (2), затем пересчитайте скорость передачи в виде суммы всех записей в буфере, разделенных на (1) ,

+0

эй .. я обновил свой код, я думаю, что вы бы знали, о чем вы меня просили .. можете ли вы проверить мой вопрос http://stackoverflow.com/questions/9030297/calculate-sending-file-speed-sec-by-taking -The-среднего из-10-ти тез-оф-получать-х годов –