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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket и QProgressBar/QProgressDialog  (Прочитано 3825 раз)
nikkadim
Гость
« : Сентябрь 17, 2012, 23:15 »

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

Заранее благодарю.
« Последнее редактирование: Сентябрь 17, 2012, 23:42 от nikkadim » Записан
V1KT0P
Гость
« Ответ #1 : Сентябрь 17, 2012, 23:30 »

Сервер сделан на QTcpServer и отдает данные клиенту (QTcpSocket) по некой комманде. Данные несклько сотен мегов льются долго и хочется сделать как-то QProgressBar или QProgressDialog в куотором отображать процесс передачи данных от сервера. Проблема в том что не могу понять где мне брать событие и value для обновления.
Ты эти сотни метров сразу пихаешь в сокет или по частям? Если по частям, то между ними считай проценты и округляй до целого числа. Затем сравнивай если процент изменился, то отправляй сигнал QProgressBar-у.
Записан
nikkadim
Гость
« Ответ #2 : Сентябрь 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;
    }
}
« Последнее редактирование: Сентябрь 17, 2012, 23:49 от nikkadim » Записан
SimpleSunny
Гость
« Ответ #3 : Сентябрь 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;
   }
}
Записан
nikkadim
Гость
« Ответ #4 : Сентябрь 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;
}

Подскажите плз, как укорить предотправку? Преаллокировать массив?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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