![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
igor_bogomolov |
![]()
Сообщение
#21
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
И еще. Сигнал readyRead () испускается каждый раз, как доступны новые данные для чтения. Увырены ли Вы, делая socket.readAll() , что все данные которые Вы ожидаете доступны для чтения. Лучьше всегда делать проверку, например функцией bytesAvailable () или canReadLine ().
Цитата qint64 QAbstractSocket::bytesAvailable () const [virtual] Возвращает число присланных байт, которые ждут прочтения. Цитата bool QAbstractSocket::canReadLine () const [virtual]
Возвращает true, если строка данных может быть прочитана из сокета; в противном случает возвращает false. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#22
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Простите, но почему я не могу редактировать сообщения? после 20 сообщений появится такая возможность.И как сделать Раскрывающийся текст. тык
|
|
|
igor_bogomolov |
![]()
Сообщение
#23
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Litkevich Yuriy Спасибо. С раскрывающимся текстом разобрался, просто был невнимателен. А с редактированием это плохо, жесткие у вас правила.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#24
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
AD |
![]() ![]()
Сообщение
#25
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
LE0N |
![]()
Сообщение
#26
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата LEON, уважай собеседника и будь вежлив. Все мы были новичками. Если человек чего-то не понимает, объясни, а не груби! Я очень редко выхожу за рамки. Это - в рамках. Неуважением здесь и не пахнет. Если вас, что то не устраивает - айда в личку - обсудим.... |
|
|
dasV |
![]()
Сообщение
#27
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 2.2.2009 Пользователь №: 522 Спасибо сказали: 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 |
![]()
Сообщение
#28
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? То есть сервер нам говорит, я пришлю 500 байт, я вижу, что их 200 и не читаю, дожидаюсь следующей порции данных. Такое возможно? Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили. Пускать while не надо. Смотри как будет происходить асинхронный обмен. Сервер говорит пришлю 500 байт, далее он начинает слать эти данные. Приходит первая порция данных (200 байт), вызывается слот readyRead, в нем ты вычитываешь 200 байт в буфер, понимаешь, что это не все данные и выходишь из слота, чуть позже приходят оставшиеся 300 байт, опять вызывается слот readyRead, в нем ты дочитываешь оставшиеся данные в тот же буфер, понимаешь что пришли все данные и обрабатываешь их (посылаешь сигнал что пакет с данными получен или переключаешь состояние на обработку этого пакета). |
|
|
LE0N |
![]()
Сообщение
#29
|
Студент ![]() Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Так же подумал, что мол не все прочитали и пишем, поэтому сделал так А с чего ты взял, что остольные данные придут сразу после того, как ты прочитал ВСЁ, что есть на данный момент ? Цитата LE0N сделал как и уважаемый просил Имелось ввиду, что на момент того, как ты обнаруживаешь ошибку, т.е. ситуация, которая складывается на данный момент - является ошибочной для твоего понимания, можно проверить весь возможный функционал твоей программы на ошибки - это называется процессом отладки. А не какие то слоты подключать....Это тоже можно, но делать это надо тогда, когда ты точно знаешь чего делаешь. Цитата а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? То есть сервер нам говорит, я пришлю 500 байт, я вижу, что их 200 и не читаю, дожидаюсь следующей порции данных. Такое возможно? Для того, что бы читать ТОЛЬКО нужное количество данных, обычно, пишут свой небольшой протокол. Например - в первых двух-8 байтах(в зависимости от максимального размера информации, которую надо передать) передают размер этой информации. Цитата Насчет отдельных QThread я понял, однако пока их не изучал и не лезу туда, но много видел советов использовать их в своих программах. Может еще что то придумать?? Есть очень хорошая чья то цитата... - Пиши как можно проще, тяжело получится само.... Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато.... Сообщение отредактировал LE0N - 27.3.2009, 23:26 |
|
|
igor_bogomolov |
![]()
Сообщение
#30
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? Нет, не можем. Этот метод возвращает количество байт доступных для чтения в данный момент. Вы сами должны знать свой протокол общения с сервером. Т.е., как уже говорилось, либо сервер в заголовке возвращает количество байт которые он собирается передать, либо есть какая то завершающая последовательность, по которой можно определить что все данные получены. Если вы протокола не знаете, и сервер просто сыпет данные, то остается только предпологать, что все данные получены, например по таймауту. Т.е. если в течении некоторого времени данные больше не поступают, делаем вывод что сервер все передал. Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили. QTcpSocket - предоставляет неблокирующий интерфейс. Т.е. если вы используете сигналы и слоты, никакого блокирования не происходит. Единственное while, как уже сказали, совершенно не нужен. Вызвали в слоте canReadLine(), если возвращает false, просто выходим. Как придут новые данные, попадем снова в наш слот, проверим canReadLine(), если true, считаем строку целиком. Таким образом и ход выполнения программы не останавливается и лишние такты мы не жрём. ![]() Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато.... А когда тогда не рано? Если никуда не лездь, то ничему и не научишься. Нужно стремиться к новым знаниям ![]() |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 27.2.2025, 20:09 |