Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неточность программы, Скорость закачки 
:(
    Опции темы
kokcu
Дата 31.5.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Здравствуйте. Столкнулся с проблемой при написании программы измерения скорости сетевой карты. 
Вот так я считаю скорость
Код

double start_b = 0;
            double end_b = 0;
            
            for (int i = 1; ; )
            {
                NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
                IPv4InterfaceStatistics stat = ni[1].GetIPv4Statistics();
                kbytes = stat.BytesReceived / 1024;
                Thread.Sleep(500);
                if (i == 1) { start_b = kbytes; ; i = 2; }
                else
                {
                    end_b = kbytes; i = 1;
                    speed = (end_b - start_b)*2;
                    
                }

            }


дальше раз в 500мс скорость выводиться в трей.

Код

label1.Text = speed.ToString()+" кб\\с";
            label4.Text = kbytes.ToString() + " кб";
            g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, 32, 32));
            if (speed < 100)
            {
                g.DrawString(speed.ToString(), new Font("Verdana", 20), new SolidBrush(Color.White), -2, 0);
            }
            if (speed >= 100)
            {
                g.DrawString(speed.ToString(), new Font("Verdana", 14), new SolidBrush(Color.White), -2, 0);
            }
            trayimage = new Bitmap(trayimagen);
            Icon icon = Icon.FromHandle(trayimage.GetHicon());
            notifyIcon1.Icon = icon;


Но проблема в том что очень большая разница с реальной скоростью. Если я ставлю закачку и ограничиваю скорость например до 30кб\с 
то программа в 1 секунду показывает 10, затем 30, 30, 46, 55, 15. Тоесть разница около 15 кб\с. 
Каким образом можно добиться более точного вычисления?
PM MAIL   Вверх
DVariuS
Дата 31.5.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 2
Всего: 8



kokcu, возможно проблема в том, что ты выводишь моментальную скорость, а нужно расчитывать среднюю, допустим, за последние 1-2 минуты и выводить результат.
Посмотри, может этот пример поможет: http://www.codeproject.com/KB/vb/downloadF...rogressbar.aspx

Это сообщение отредактировал(а) DVariuS - 31.5.2009, 10:34
PM MAIL   Вверх
kokcu
Дата 31.5.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



DVariuS, спасибо, попробую разобраться, но будет сложно так как вб вообще не знаю smile 
PM MAIL   Вверх
kokcu
Дата 31.5.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Попробовал сделать среднее значение последних 3 скоростей, но как то криво получилось smile 
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static public double srd = 0;
        static public double[] d = { 0, 0, 0, 0 };
        static void Main(string[] args)
        {
            Thread t = new Thread(vv);
            t.Start();
            double start_b = 0;
            double end_b = 0;
            double razn = 0;
            

            for (int i = 0; ; )
            {
                NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
                IPv4InterfaceStatistics stat = ni[1].GetIPv4Statistics();
                double kbytes = stat.BytesReceived / 1024;
                Thread.Sleep(500);
                if (i == 1) { start_b = kbytes; ; i = 2; }
                else
                {
                    end_b = kbytes; i = 1;
                    razn = (end_b - start_b)*4;
                    d[i] = razn;
                    if (i == 3) { i = 0; }
                }
            }
            Console.ReadLine();
        }
        static public void vv()
        {
            for (int a = 1; ; )
            {
                srd = (d[0] + d[1] + d[2] + d[3]) / 4;
                Console.WriteLine(srd.ToString());
                Thread.Sleep(1000);
            }
        }


    }
}


Что можно сделать? 

Это сообщение отредактировал(а) kokcu - 31.5.2009, 12:43
PM MAIL   Вверх
DVariuS
Дата 31.5.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 10.2.2009
Где: Ukraine

Репутация: 2
Всего: 8



kokcu, посмотри http://www.codeproject.com/KB/system/networkmonitorl.aspx
Там применяется даже более правильный подход, чем я предложил: просто берется количество переданных/принятых байт всего с момента подключения и сравнивается со значением, полученным секунду назад.
PM MAIL   Вверх
kokcu
Дата 31.5.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Спасибо! то что надо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.