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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QTcpSocket и QXmlStreamWriter  (Прочитано 22992 раз)
ритт
Гость
« Ответ #15 : Июль 22, 2009, 19:34 »

<Nelson mode>ха-ха</Nelson mode>

в курсе, что readyRead() рассылается каждый раз, когда была получена порция данных?
пришло тебе 20 байт, а ты и рад сразу парсить...опа, а в документе было 60Кб...
!rtfm: QIODevice::waitForReadyRead
Записан
ритт
Гость
« Ответ #16 : Июль 22, 2009, 21:48 »

ключевое слово rtfm

/* на вс.случай http://en.wikipedia.org/wiki/RTFM */
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #17 : Июль 22, 2009, 22:27 »

И что с етим делать? Если поставить вместо readyRead() то не помогает.

waitForReadyRead это не сигнал. Поэтому данная замена работать не будет. Это абсолютно неадекватная замена.

IncomingDataXML также написана неверное. Откуда уверенность, что все данные прийдут за один раз? Почитай про Incremental parsing QXmlStreamReader


ЗЫ: Антилох, здесь нет форумчан "ежик" и т.п., есть Константин, запомни это! И выбирай выражения попроще - это предупреждение. Я тебя вчера отсылал почитать правила форума? Отсылал. Непонял - прочитай еще раз.
« Последнее редактирование: Июль 22, 2009, 22:49 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
max1983
Гость
« Ответ #18 : Июль 22, 2009, 22:45 »

Цитировать
Откуда уверенность, что все данные прийдут за один раз? Почитай про Incremental parsing QXmlStreamReader
ну иногда же приходят..
есть 2 варианта
1 все приходит
2 приходят первые 3 строчки..
Второе бывает чаще.

Ну хоть у кого то есть пример как считать все данные QXmlStreamReaderom посредством сокета?
« Последнее редактирование: Июль 22, 2009, 22:49 от max1983 » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #19 : Июль 22, 2009, 22:48 »

ну иногда же приходят..

Ну тогда иногда твоя прога и будет работать, ничем помочь в этом случае нельзя. Это первый вариант. Второй вариант сделать чтение по-человечески, т.к. приход данных в полном объеме не гарантирован и с этим ничего не попишешь
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
max1983
Гость
« Ответ #20 : Июль 22, 2009, 22:53 »

Цитировать
Ну тогда иногда твоя прога и будет работать, ничем помочь в этом случае нельзя. Это первый вариант. Второй вариант сделать чтение по-человечески, т.к. приход данных в полном объеме не гарантирован и с этим ничего не попишешь
Теряется весь смысл QXmlStreamReaderа если я не могу сериализовать данные без остановки нафиг он мне вообще сдался?
Ну представь я заполняю элементами XML в цикле свой класс.. и опа! данные закончились.
Вся идея в том чтоб когда все данные пришли начинать сериализацию и завершить ее.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #21 : Июль 22, 2009, 23:17 »

QXmlStreamReaderа абсолютно здесь непричем. Почитай инфу про сокеты
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
max1983
Гость
« Ответ #22 : Июль 22, 2009, 23:34 »

У меня появилась теория что лагает Windows 7.
Желающие протестировать есть? Пишите в ПМ.
Записан
ритт
Гость
« Ответ #23 : Июль 22, 2009, 23:48 »

хм, а при чём здесь оска?

Теряется весь смысл QXmlStreamReaderа если я не могу сериализовать данные без остановки нафиг он мне вообще сдался?
теряется весь смысл написания документации, если её не читают...

Вся идея в том чтоб когда все данные пришли начинать сериализацию и завершить ее.
дык, воспользуйся waitForReadyRead и разбирай поток порцию за порцией.
либо индусский вариант - на readyRead складывай данные в кучку, а когда данные перестанут приходить, начинай разбор
Записан
max1983
Гость
« Ответ #24 : Июль 23, 2009, 00:12 »

Цитировать
bool QAbstractSocket::waitForReadyRead ( int msecs = 30000 )   [virtual]
Эта функция блокирует сокет, пока данные, доступные для чтения, не будут прочитаны с помощью readyRead() и соответствующий сигнал не будет послан. Эта функция имеет таймаут msecs, заданныё в миллисекундах; по умолчанию он равен 3000 мс.
Функция возвращает true, если данные доступны для чтения; в противном случае возвращается false (если произошла ошибка или прошло время таймаута).

Как по мне из выше сказанного становится понятно что данная фишка не применима.
Но я сделал попытку  и результат стал интереснее примерно  50% запросов успешно принимают XML без проблем.
Записан
ритт
Гость
« Ответ #25 : Июль 23, 2009, 00:42 »

нет, ты определённо издеваешься.

Цитировать
void QIODevice::readyRead ()   [signal]

This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.

readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).

а можно вообще не дожидаться всего документа - примерно так:
Код
C++ (Qt)
   QTcpSocket * Sok = new QTcpSocket();
   Sok->connectToHost("127.0.0.1",5000);
 
   QXmlStreamWriter *  wr = new QXmlStreamWriter(Sok);
   QXmlStreamReader * rd = new QXmlStreamReader(Sok);
 
   wr->setAutoFormatting(true);
   wr->writeStartDocument();
  wr->writeStartElement("ValueStart");//Root
 
wr->writeStartElement("ValueNext");
wr->writeEndElement();
 
wr->writeStartElement("ValueNext2");
wr->writeEndElement();
 
wr->writeStartElement("ValueNext3");
wr->writeEndElement();
 
wr->writeEndElement();
   wr->writeEndDocument();//End Root
   Sok->flush();
 
<snip>
 
void MainWindowImpl::IncomingDataXML()
{
rd->readNext();
while(!rd->atEnd())
{
// parsing code there
// ...
 
rd->readNext();
}
}
 
добавь обработку ошибок и т.д.

upd: хмм, пропустил connect(readyRead -> IncomingDataXML)
« Последнее редактирование: Июль 23, 2009, 15:22 от Константин » Записан
BigZ
Гость
« Ответ #26 : Июль 23, 2009, 08:33 »

int z=0;

   
   while(!rd->atEnd() || (z = rd->atEnd()))
   {
      int i = rd->atEnd();
   
      
      QMessageBox::about(0,"AAAAAAAAAAAA",QString::number(z));
      
то есть циферка 1 говорит что ошибка UnexpectedElementError


Даю последнюю подсказку в этой теме:
bool QXmlStreamReader::atEnd () const

"циферка 1" - говорит о том что atEnd() вернула true!
Записан
Blayder
Гость
« Ответ #27 : Июль 23, 2009, 09:42 »

Цитировать
Код
C++ (Qt)
int z=0;
 
 
  while(!rd->atEnd() || (z = rd->atEnd()))
  {
     int i = rd->atEnd();
 
 
     QMessageBox::about(0,"AAAAAAAAAAAA",QString::number(z));
Цитировать
(z = rd->atEnd())
тож самое что и
Цитировать
int i = rd->atEnd();
т.е. там может должно быть так:
Код
C++ (Qt)
while(!rd->atEnd() || (z == rd->atEnd()))
Записан
max1983
Гость
« Ответ #28 : Июль 23, 2009, 11:34 »

Цитировать
"циферка 1" - говорит о том что atEnd() вернула true!

Все верно я ошибся принял за другой возврат ошибки.  Шокированный

Так как QXmlStreamReader и его братан QXmlStreamWriter работают крайне странно с сокетом
они мне больше не нужны так как их практическое применение в данной связке просто не является удобным или практически правильным подходом.
Я решу свою задачу простым сокетом быстро и без проблем.
Если кто имеет пример практического использования - пусть выложит другим будет интересно.
Записан
ритт
Гость
« Ответ #29 : Июль 23, 2009, 12:47 »

слов нет
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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