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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоки, QNA, QNP и finished()  (Прочитано 2299 раз)
Orfus
Гость
« : Октябрь 26, 2011, 20:12 »

Доброго времени суток.
Имеется: Главный поток управляющий N потоками в которых крутятся N QNetworkAccessManager цель которых получить и спарсить страницы. Главный поток, перед тем как выдать задание назначает дочерним проксю. Каждому дочернему уникальную, но у всех 1го типа QNetworkProxy::HttpProxy.

Всё прекрасно работает начинает работать. Проблема же заключается в том что приём виснет.

Собственно говоря, как я это определяю. По сигналу readyRead() от  QNetworkReply я вызываю сло примерно следующего содержания:
Код
C++ (Qt)
   if(_Step==RequestThread::File && RecFile)
       RecFile->write(reply->readAll());
   else{
       QString str;
       str.append(reply->readAll());
 
       stringHTML.append(str);
 
       QFile logFile(this->objectName()+"###.txt");
       logFile.open(QIODevice::Append);
       logFile.write(str.toUtf8());
       logFile.close();
   }
 
Какое-то время файлы пишутся но потом их размеры замирают (могут помереть на 42Кб могут на 18Мб).

В то же самое время, через те же самые прокси FireFox успевает принять нужную мне страницу до конца (определяю по наличию </html> в stringHTML), причем дважды (1 раз с графикой, второй раз в виде исходного кода страницы).

Прошу совета как быть в такой ситуации.
Можно ли как то реанимировать процесс приёма страницы?
Стоит ли делать делать reply->abort(); по сигналу некоего таймера или прокся должна сама сообщить о смерти?  Непонимающий
Записан
SimpleSunny
Гость
« Ответ #1 : Октябрь 26, 2011, 20:43 »

Если работаешь с проксями, то лучше заведи себе таймер секунд 10-20, в зависимости от качества прокси.
При начале загрузки запускай таймер, в слоте readyRead, перезапускай таймер, в слоте finished останавливай.
И в слоте timeout reply->abort();
Записан
Orfus
Гость
« Ответ #2 : Октябрь 26, 2011, 20:47 »

Ну у меня проблема в том что
1) прием медленный (огнелис в 2 раза быстрее работает).
2) прием останавливается, а у огнелиса нет.
Записан
Orfus
Гость
« Ответ #3 : Октябрь 27, 2011, 22:59 »

Ну у меня проблема в том что
1) прием медленный (огнелис в 2 раза быстрее работает).
2) прием останавливается, а у огнелиса нет.

Собственно переписал под QSslSocket. Стало лучше, но не совсем. Осталась одна небольшая проблема, сокет переходит в статус QAbstractSocket::UnconnectedState раньше чем я успеваю вычитать с него конец.

Пробовал ловить
Код
C++ (Qt)
...................
   connect(socket,SIGNAL(readyRead()),this,SLOT(readB()));
   connect(socket,SIGNAL(readChannelFinished()),this,SLOT(readB()));
   connect(socket,SIGNAL(aboutToClose()),this,SLOT(readB()));
   connect(socket,SIGNAL(disconnected()),this,SLOT(readB()));
   connect(socket,SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(sslErrors(QList<QSslError>)));
   connect(socket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(stateChanged(QAbstractSocket::SocketState)));
....................
void SslGrabber::stateChanged(QAbstractSocket::SocketState state){
   qWarning()<<"SslGrabber::stateChanged()"<<state;
   if(state==QAbstractSocket::ClosingState)readB();
}
 
void SslGrabber::readB(){
   // qWarning()<<"SslGrabber::readB()";
   QFile fi("log.txt");
   fi.open(QIODevice::Append);
   while(socket->bytesAvailable()){
          fi.write(socket->readAll());
          socket->waitForReadyRead(1);
   }
   fi.close();
}
 
Безрезультатно.

всё протекает примерно следующим образом
Цитировать
Запускается C:\QtSDK\PROJECTS\SSL_Test-build-desktop\release\SSL_Test.exe...
SslGrabber::SslGrabber(QObject *parent)
SslGrabber::stateChanged() QAbstractSocket::HostLookupState
SslGrabber::stateChanged() QAbstractSocket::ConnectingState
SslGrabber::stateChanged() QAbstractSocket::ConnectedState
SslGrabber::sslErrors
SslGrabber::StartRec()
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::timeout() QAbstractSocket::ConnectedState 0
SslGrabber::stateChanged() QAbstractSocket::ClosingState
SslGrabber::stateChanged() QAbstractSocket::UnconnectedState
SslGrabber::timeout() QAbstractSocket::UnconnectedState 0
C:\QtSDK\PROJECTS\SSL_Test-build-desktop\release\SSL_Test.exe завершился с кодом 0

Кто что может посоветовать в плане отлова хвоста? не дописывает не так уж и много порядка 10кб, по сравнению со страницей в 8мб...

UPDATE
Переписал прием на
Код
C++ (Qt)
void SslGrabber::readB(){
  // qWarning()<<"SslGrabber::readB()";
   QFile fi("log.txt");
   fi.open(QIODevice::Append);
   fi.write(socket->readAll());
   fi.close();
}
 
и проблема решилась. Из 4х попыток 4 раза страница была записана до конца. Спасибо всем отвечавшим :clapping:
« Последнее редактирование: Октябрь 28, 2011, 07:48 от Orfus » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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