Russian Qt Forum

Qt => Работа с сетью => Тема начата: nikkadim от Сентябрь 17, 2012, 23:15



Название: QTcpSocket и QProgressBar/QProgressDialog
Отправлено: nikkadim от Сентябрь 17, 2012, 23:15
Пождскажите плз, есть клиент с сервером сделанные по аналогии с примером вот здесь: http://qt-doc.ru/realizacia-klienta-s-pomoschu-klassa-qtcpsocket.html
Сервер сделан на QTcpServer и отдает данные клиенту (QTcpSocket) по некой комманде. Данные несклько сотен мегов льются долго и хочется сделать как-то QProgressBar или QProgressDialog в куотором отображать процесс передачи данных от сервера. Проблема в том что не могу понять где мне брать событие и value для обновления.

Заранее благодарю.


Название: Re: QTcpSocket и QProgressBar/QProgressDialog
Отправлено: V1KT0P от Сентябрь 17, 2012, 23:30
Сервер сделан на QTcpServer и отдает данные клиенту (QTcpSocket) по некой комманде. Данные несклько сотен мегов льются долго и хочется сделать как-то QProgressBar или QProgressDialog в куотором отображать процесс передачи данных от сервера. Проблема в том что не могу понять где мне брать событие и value для обновления.
Ты эти сотни метров сразу пихаешь в сокет или по частям? Если по частям, то между ними считай проценты и округляй до целого числа. Затем сравнивай если процент изменился, то отправляй сигнал QProgressBar-у.


Название: Re: QTcpSocket и QProgressBar/QProgressDialog
Отправлено: nikkadim от Сентябрь 17, 2012, 23:38
я сразу отдаю событие readyRead() в слот slotReadyRead():

Код:
void MyClient::slotReadyRead()
{
    QDataStream in(m_pTcpSocket);
    in.setVersion(QDataStream::Qt_4_8);
    for (;;) {
        if (!m_nNextBlockSize) {
            if (m_pTcpSocket->bytesAvailable() < (int)sizeof(quint64)) {
                break;
            }
            in >> m_nNextBlockSize;
        }

        if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
break;
        }
        in >> bList; //QList
m_nNextBlockSize = 0;
    }
}


Название: Re: QTcpSocket и QProgressBar/QProgressDialog
Отправлено: SimpleSunny от Сентябрь 18, 2012, 18:56
1. Вместо (int)sizeof(quint64) лучше писать (int)sizeof(m_nNextBlockSize).
2. Добавь пару своих сигналов и соедини их с соответствующими слотами, но надо понимать, что в этой реализации прогресбар будет реагировать на каждую часть.
Код
C++ (Qt)
void MyClient::slotReadyRead()
{
   QDataStream in(m_pTcpSocket);
   in.setVersion(QDataStream::Qt_4_8);
   for (;;) {
       if (!m_nNextBlockSize) {
           if (m_pTcpSocket->bytesAvailable() < (int)sizeof(quint64)) {
               break;
           }
           in >> m_nNextBlockSize;
           emit initRange(0, m_nNextBlockSize);
       }
 
       emit newValue(m_pTcpSocket->bytesAvailable());
       if (m_pTcpSocket->bytesAvailable() < m_nNextBlockSize) {
break;
       }
       in >> bList; //QList
m_nNextBlockSize = 0;
   }
}


Название: Re: QTcpSocket и QProgressBar/QProgressDialog
Отправлено: nikkadim от Сентябрь 18, 2012, 20:15
Спасиб. Дикие задержки из-за которых хотел делать прогресс бар, оказались на стороне передающего,
По таскбару на больших данных увидел, что там оч медленно росли размеры запрошенной памяти, а потом, очень быстро все передалось по сети (cмотрел wireshark'ом) - около 180 Mbit/s.

На той стороне передаю вот так:

Код:
qint64 RemoteGrabber::sendToClient(QTcpSocket* pSocket, const QString& str)
{
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_8);

    out << quint64(0) << bytelist << str;

    out.device()->seek(0);
    out << quint64(arrBlock.size() - sizeof(quint64));

    pSocket->write(arrBlock);
qint64 byteswritten = pSocket->write(arrBlock);
return byteswritten;
}

Подскажите плз, как укорить предотправку? Преаллокировать массив?