Ожидание чтения и сокращение загрузки процессора. |
Здравствуйте, гость ( Вход | Регистрация )
Ожидание чтения и сокращение загрузки процессора. |
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 |
Простите, но почему я не могу редактировать сообщения? после 20 сообщений появится такая возможность.И как сделать Раскрывающийся текст. тык
|
|
|
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 |
|
|
|
AD |
27.3.2009, 9:48
Сообщение
#25
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
|
|
|
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, вообще не понятно ничего =( Так же подумал, что мол не все прочитали и пишем, поэтому сделал так
в результате все нормально в начале было 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 |
Хотел бы спросить 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 |
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? Нет, не можем. Этот метод возвращает количество байт доступных для чтения в данный момент. Вы сами должны знать свой протокол общения с сервером. Т.е., как уже говорилось, либо сервер в заголовке возвращает количество байт которые он собирается передать, либо есть какая то завершающая последовательность, по которой можно определить что все данные получены. Если вы протокола не знаете, и сервер просто сыпет данные, то остается только предпологать, что все данные получены, например по таймауту. Т.е. если в течении некоторого времени данные больше не поступают, делаем вывод что сервер все передал. Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили. QTcpSocket - предоставляет неблокирующий интерфейс. Т.е. если вы используете сигналы и слоты, никакого блокирования не происходит. Единственное while, как уже сказали, совершенно не нужен. Вызвали в слоте canReadLine(), если возвращает false, просто выходим. Как придут новые данные, попадем снова в наш слот, проверим canReadLine(), если true, считаем строку целиком. Таким образом и ход выполнения программы не останавливается и лишние такты мы не жрём. Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато.... А когда тогда не рано? Если никуда не лездь, то ничему и не научишься. Нужно стремиться к новым знаниям |
|
|
Текстовая версия | Сейчас: 29.11.2024, 20:36 |