Russian Qt Forum
Ноябрь 24, 2024, 00:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Расчет скорости сокетов  (Прочитано 2548 раз)
RedDog
Гость
« : Октябрь 06, 2011, 16:26 »

Есть сервер, который пересылает данные, и есть клиент, который их принимает.
На клиенте каждые 80мс. проверяю количество принятых данных... чего то не правильно рассчитывает:

Код:
class NetworkConnection : public QObject
{
    Q_OBJECT
public:
    explicit NetworkConnection(QObject *parent = 0);
    ~NetworkConnection();
 
private:
    QTcpSocket *connection;
    double m_totalReceived;
    double m_totalReceivedLast;
    int timeCoeff;
 
signals:
    void downloadSpeed(double speed);
 
private slots:
    void on_dataRead();
    void on_speedMetterTimer();
};

Код:
void NetworkConnection::on_dataRead()
{
......
    QDataStream input(connection);
    QByteArray buf = input.device()->readAll();
    m_totalReceived+=buf.size();
.....
}
 
void NetworkConnection::on_speedMetterTimer()
{
    if (!m_needCheckDownloadSpeed)
        return;
    double speed = (m_totalReceived - m_totalReceivedLast) * 100 * timeCoeff;
//    скорость рассчитывается в битах, т.е. 1000мс(в секунде)/80мс(интервал таймера) * 8бит
 
    if (speed != 0)
    {
        emit downloadSpeed(speed);
        timeCoeff = 1;
        m_totalReceivedLast = m_totalReceived;
    }
    else
        timeCoeff++;
    QTimer::singleShot(80, this, SLOT(on_speedMetterTimer()));
}

Вне зависимости, от того какую задержку на отсылку на сервере ставлю, скорость на клиенте не меняется, а меняется она только в зависимости от интервала таймера QTimer::singleShot(80, this, SLOT(on_speedMetterTimer()));
ЗЫ: на сервере высылаю данные пакетами по 1024*64 байт (64К), для теста прилепил туда задержку между пакетами (которая ни на что не влияет).
Где накосячил?
Записан
andrew.k
Гость
« Ответ #1 : Октябрь 06, 2011, 23:42 »

Код
C++ (Qt)
 
{
int measureInterval = 80;
timer.setInterval( measureInterval );
timer.setSingleShot( false );
connect( &timer, SIGNAL( timeout() ), SLOT( measureSpeed() ) );
}
 
{
 bytesReceived = 0;
 timer.start();
}
 
void NetworkConnection::onDataRead()
{
QByteArray buf = input.device()->readAll();
bytesReceived += buf.size();
...
}
void NetworkConnection::measureSpeed()
{
 double speed = bytesReceived * 8 / measureInterval * 1000;
 bytesReceived = 0;
 emit downloadSpeed( speed );
}
 
 
{
 timer.stop();
}
 
« Последнее редактирование: Октябрь 06, 2011, 23:45 от andrew.k » Записан
andrew.k
Гость
« Ответ #2 : Октябрь 06, 2011, 23:48 »

и 80 мс это маловато.
Скорость для пользователя предназначается?
Он не сможет отслеживать изменение значения 12 раз в секунду.
500 или 1000 мс нормально
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.19 секунд. Запросов: 21.