Russian Qt Forum

Qt => Работа с сетью => Тема начата: RedDog от Октябрь 06, 2011, 16:26



Название: Расчет скорости сокетов
Отправлено: 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К), для теста прилепил туда задержку между пакетами (которая ни на что не влияет).
Где накосячил?


Название: Re: Расчет скорости сокетов
Отправлено: andrew.k от Октябрь 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();
}
 


Название: Re: Расчет скорости сокетов
Отправлено: andrew.k от Октябрь 06, 2011, 23:48
и 80 мс это маловато.
Скорость для пользователя предназначается?
Он не сможет отслеживать изменение значения 12 раз в секунду.
500 или 1000 мс нормально