crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V  < 1 2 3 4 5 >  
Ответить в данную темуНачать новую тему
> Ожидание чтения и сокращение загрузки процессора.
igor_bogomolov
  опции профиля:
сообщение 27.3.2009, 1:18
Сообщение #21


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


И еще. Сигнал readyRead () испускается каждый раз, как доступны новые данные для чтения. Увырены ли Вы, делая socket.readAll() , что все данные которые Вы ожидаете доступны для чтения. Лучьше всегда делать проверку, например функцией bytesAvailable () или canReadLine ().
Цитата
qint64 QAbstractSocket::bytesAvailable () const [virtual]

Возвращает число присланных байт, которые ждут прочтения.

Цитата
bool QAbstractSocket::canReadLine () const [virtual]

Возвращает true, если строка данных может быть прочитана из сокета; в противном случает возвращает false.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.3.2009, 1:45
Сообщение #22


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 27.3.2009, 2:51) *
Простите, но почему я не могу редактировать сообщения?
после 20 сообщений появится такая возможность.
Цитата(igor_bogomolov @ 27.3.2009, 2:51) *
И как сделать Раскрывающийся текст.
тык
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 27.3.2009, 3:33
Сообщение #23


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Litkevich Yuriy Спасибо. С раскрывающимся текстом разобрался, просто был невнимателен. А с редактированием это плохо, жесткие у вас правила.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.3.2009, 4:27
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 27.3.2009, 6:33) *
А с редактированием это плохо, жесткие у вас правила.
попрошу админа, чтобы дал тебе такую возможность уже сейчас
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.3.2009, 9:48
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(LE0N @ 13.3.2009, 19:51) *
QString QIODevice::errorString () const ?
Кто должен отлаживать, ты или МЫ?

LEON, уважай собеседника и будь вежлив. Все мы были новичками. Если человек чего-то не понимает, объясни, а не груби!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 27.3.2009, 12:49
Сообщение #26


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
LEON, уважай собеседника и будь вежлив. Все мы были новичками. Если человек чего-то не понимает, объясни, а не груби!

Я очень редко выхожу за рамки. Это - в рамках. Неуважением здесь и не пахнет. Если вас, что то не устраивает - айда в личку - обсудим....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 27.3.2009, 19:45
Сообщение #27


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 2.2.2009
Пользователь №: 522

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем спасибо за ответы.
Сделал socket.flush (); однако ничего не изменилось. Решил посмотреть состояние socket и выяснилось, что оно все время QAbstractSocket::ConnectedState то есть вроде как ошибок и нет, правда если после socket.write сделать socket.flush (); то состояние меняется на QAbstractSocket::UnconnectedState, вообще не понятно ничего =(

Так же подумал, что мол не все прочитали и пишем, поэтому сделал так

out<<socket.bytesAvailable()<<endl;
tmp=xmlParser(socket.readAll());
out<<socket.bytesAvailable()<<endl;


в результате все нормально в начале было 308 байт стало 0.

2_LE0N сделал как и уважаемый просил
QObject::connect(&socket, SIGNAL(sslErrors(QList<QSslError>)),this, SLOT(socketErrors(QList<QSslError>)));
результат к сожалению тот же, слот не вызывается.

Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? То есть сервер нам говорит, я пришлю 500 байт, я вижу, что их 200 и не читаю, дожидаюсь следующей порции данных. Такое возможно?

Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили.

Насчет отдельных QThread я понял, однако пока их не изучал и не лезу туда, но много видел советов использовать их в своих программах.

Может еще что то придумать??

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 27.3.2009, 20:27
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(dasV @ 27.3.2009, 19:45) *
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? То есть сервер нам говорит, я пришлю 500 байт, я вижу, что их 200 и не читаю, дожидаюсь следующей порции данных. Такое возможно?

Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили.

Пускать while не надо. Смотри как будет происходить асинхронный обмен. Сервер говорит пришлю 500 байт, далее он начинает слать эти данные. Приходит первая порция данных (200 байт), вызывается слот readyRead, в нем ты вычитываешь 200 байт в буфер, понимаешь, что это не все данные и выходишь из слота, чуть позже приходят оставшиеся 300 байт, опять вызывается слот readyRead, в нем ты дочитываешь оставшиеся данные в тот же буфер, понимаешь что пришли все данные и обрабатываешь их (посылаешь сигнал что пакет с данными получен или переключаешь состояние на обработку этого пакета).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 27.3.2009, 23:24
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Так же подумал, что мол не все прочитали и пишем, поэтому сделал так

А с чего ты взял, что остольные данные придут сразу после того, как ты прочитал ВСЁ, что есть на данный момент ?
Цитата
LE0N сделал как и уважаемый просил

Имелось ввиду, что на момент того, как ты обнаруживаешь ошибку, т.е. ситуация, которая складывается на данный момент - является ошибочной для твоего понимания, можно проверить весь возможный функционал твоей программы на ошибки - это называется процессом отладки. А не какие то слоты подключать....Это тоже можно, но делать это надо тогда, когда ты точно знаешь чего делаешь.
Цитата
а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? То есть сервер нам говорит, я пришлю 500 байт, я вижу, что их 200 и не читаю, дожидаюсь следующей порции данных. Такое возможно?

Для того, что бы читать ТОЛЬКО нужное количество данных, обычно, пишут свой небольшой протокол. Например - в первых двух-8 байтах(в зависимости от максимального размера информации, которую надо передать) передают размер этой информации.
Цитата
Насчет отдельных QThread я понял, однако пока их не изучал и не лезу туда, но много видел советов использовать их в своих программах.

Может еще что то придумать??

Есть очень хорошая чья то цитата...
- Пиши как можно проще, тяжело получится само....
Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато....

Сообщение отредактировал LE0N - 27.3.2009, 23:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 28.3.2009, 1:29
Сообщение #30


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(dasV @ 27.3.2009, 19:45) *
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать?

Нет, не можем. Этот метод возвращает количество байт доступных для чтения в данный момент. Вы сами должны знать свой протокол общения с сервером. Т.е., как уже говорилось, либо сервер в заголовке возвращает количество байт которые он собирается передать, либо есть какая то завершающая последовательность, по которой можно определить что все данные получены. Если вы протокола не знаете, и сервер просто сыпет данные, то остается только предпологать, что все данные получены, например по таймауту. Т.е. если в течении некоторого времени данные больше не поступают, делаем вывод что сервер все передал.

Цитата(dasV @ 27.3.2009, 19:45) *
Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили.

QTcpSocket - предоставляет неблокирующий интерфейс. Т.е. если вы используете сигналы и слоты, никакого блокирования не происходит. Единственное while, как уже сказали, совершенно не нужен. Вызвали в слоте canReadLine(), если возвращает false, просто выходим. Как придут новые данные, попадем снова в наш слот, проверим canReadLine(), если true, считаем строку целиком. Таким образом и ход выполнения программы не останавливается и лишние такты мы не жрём. :rolleyes:

Цитата(LEON) *
Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато....

А когда тогда не рано? Если никуда не лездь, то ничему и не научишься. Нужно стремиться к новым знаниям :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

5 страниц V  < 1 2 3 4 5 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 20:27