crossplatform.ru

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

> Ожидание чтения и сокращение загрузки процессора.
dasV
  опции профиля:
сообщение 13.3.2009, 17:47
Сообщение #1


Студент
*

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

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




Репутация:   0  


Добрый день уважаемые. Я новичок в qt да и в c++ поэтому бейте меня и посылайте на RTFM.


Есть Вот такой код

QString M_class::ReadSocket()
{
    QTime TimeOut;
    TimeOut.start();
    while(!socket.waitForReadyRead())
        {    
            QCoreApplication::processEvents();
            if(TimeOut.elapsed()>=6000)
            {
                return(0);
            }
        }
    return(socket.readAll());
}


Так вот он создает нагрузку на процессор, а если ожидание затягивается, то и вовсе становится неприятно что я такой вот пожиратель тактов.

Можно ли справить ситуацию?? Сразу оговорюсь что программа консольная и в ней нет Q_OBJECT с вызовом QTimer::timeout ()

Да еще вопрос, к месту ли тут QCoreApplication::processEvents()???

С уважением
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
dasV
  опции профиля:
сообщение 27.3.2009, 19:45
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 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
Сообщение #3


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

Группа: Участник
Сообщений: 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, в нем ты дочитываешь оставшиеся данные в тот же буфер, понимаешь что пришли все данные и обрабатываешь их (посылаешь сигнал что пакет с данными получен или переключаешь состояние на обработку этого пакета).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- dasV   Ожидание чтения и сокращение загрузки процессора.   13.3.2009, 17:47
- - kwisp   dasV, что мешает включить в конольную прогу Q_OBJ...   13.3.2009, 17:52
- - Litkevich Yuriy   dasV, цыклы лучше в отдельный поток помещать у них...   13.3.2009, 17:56
- - LE0N   virtual bool waitForReadyRead ( int msecs = 30000 ...   13.3.2009, 17:56
- - dasV   Хм, написал вот что QString Sms_class::R...   13.3.2009, 19:24
- - LE0N   QString QIODevice::errorString () const ? Кто долж...   13.3.2009, 19:51
|- - AD   Цитата(LE0N @ 13.3.2009, 19:51) QString Q...   27.3.2009, 9:48
- - Litkevich Yuriy   Цитата(dasV @ 13.3.2009, 22:24) if(tmp.is...   13.3.2009, 20:24
- - kwisp   Цитата(Litkevich Yuriy @ 13.3.2009, 17:56...   13.3.2009, 20:25
- - Litkevich Yuriy   Цитата(kwisp @ 13.3.2009, 23:24) должно п...   13.3.2009, 20:26
- - LE0N   Цитатапеременная tmp какого типа? Очевидно же - Q...   13.3.2009, 20:33
- - dasV   А я и не говорил что нельзя, мне просто неудобно, ...   13.3.2009, 22:16
- - kwisp   dasV, с этого надо было начинать. давай задачу по...   13.3.2009, 22:27
- - Litkevich Yuriy   Цитата(dasV @ 14.3.2009, 1:16) А в консол...   13.3.2009, 22:32
- - dasV   Задача такова, я должен послать на сервер запрос а...   14.3.2009, 20:01
- - kwisp   dasV, существует такой метод или "агрегат...   14.3.2009, 20:27
- - dasV   2_ kwisp Спасибо, буду думать, а это не оно ли слу...   14.3.2009, 20:54
- - kwisp   Цитата(dasV @ 14.3.2009, 20:54) а это не ...   15.3.2009, 9:16
- - dasV   Доброго времени суток уважаемые. Сделал как и сказ...   26.3.2009, 19:33
|- - igor_bogomolov   Может я уже немного не в тему и не вовремя, но я б...   26.3.2009, 23:51
- - igor_bogomolov   Дополнительно(конкретно по вопроссу) Цитата(dasV ...   27.3.2009, 0:44
|- - igor_bogomolov   И еще. Сигнал readyRead () испускается каждый раз,...   27.3.2009, 1:18
- - Litkevich Yuriy   Цитата(igor_bogomolov @ 27.3.2009, 2:51) ...   27.3.2009, 1:45
- - igor_bogomolov   Litkevich Yuriy Спасибо. С раскрывающимся текстом ...   27.3.2009, 3:33
- - Litkevich Yuriy   Цитата(igor_bogomolov @ 27.3.2009, 6:33) ...   27.3.2009, 4:27
- - LE0N   ЦитатаLEON, уважай собеседника и будь вежлив. Все ...   27.3.2009, 12:49
- - dasV   Всем спасибо за ответы. Сделал socket.flush (); од...   27.3.2009, 19:45
|- - BRE   Цитата(dasV @ 27.3.2009, 19:45) Хотел бы ...   27.3.2009, 20:27
- - LE0N   ЦитатаТак же подумал, что мол не все прочитали и п...   27.3.2009, 23:24
- - igor_bogomolov   Цитата(dasV @ 27.3.2009, 19:45) Хотел бы ...   28.3.2009, 1:29
- - LE0N   ЦитатаА когда тогда не рано? Если никуда не лездь,...   28.3.2009, 10:39
- - dasV   Добрый день уважаемые, только что вернулся из анаб...   6.4.2009, 11:43
- - igor_bogomolov   У вас хоть какой-то протокол общения с сервером ес...   6.4.2009, 12:19
- - dasV   Добрый день. Протокол общения обычный http, я зна...   6.4.2009, 12:44
|- - Sokoloff   Цитата(dasV @ 6.4.2009, 13:44) Добрый ден...   6.4.2009, 18:09
- - igor_bogomolov   Цитата(dasV @ 6.4.2009, 13:44) я знаю, ск...   6.4.2009, 12:57
- - dasV   Да я действительно не очень…ммм, не очень корректн...   6.4.2009, 13:25
- - Litkevich Yuriy   Цитата(dasV @ 6.4.2009, 17:25) Я к сожале...   6.4.2009, 13:29
|- - trdm   Цитата(Litkevich Yuriy @ 6.4.2009, 14:29)...   6.4.2009, 14:59
- - igor_bogomolov   Приложите еще хотябы код метода в котором вы считы...   6.4.2009, 15:53
- - dasV   То же самое, к сожалению, результат вывода примерн...   6.4.2009, 16:34
- - dasV   Похоже, что так оно и есть, после получения данных...   7.4.2009, 18:36


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 27.4.2024, 21:45