Ожидание чтения и сокращение загрузки процессора. |
Здравствуйте, гость ( Вход | Регистрация )
Ожидание чтения и сокращение загрузки процессора. |
dasV |
13.3.2009, 17:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 19 Регистрация: 2.2.2009 Пользователь №: 522 Спасибо сказали: 0 раз(а) Репутация: 0 |
Добрый день уважаемые. Я новичок в qt да и в c++ поэтому бейте меня и посылайте на RTFM.
Есть Вот такой код
Так вот он создает нагрузку на процессор, а если ожидание затягивается, то и вовсе становится неприятно что я такой вот пожиратель тактов. Можно ли справить ситуацию?? Сразу оговорюсь что программа консольная и в ней нет Q_OBJECT с вызовом QTimer::timeout () Да еще вопрос, к месту ли тут QCoreApplication::processEvents()??? С уважением |
|
|
igor_bogomolov |
28.3.2009, 1:29
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Хотел бы спросить igor_bogomolov, скажите, вот сколько у нас байт на чтениемы, можем узнать, с помощью функции bytesAvailable а сколько должны (то есть сколько реально должны прочитать) можно ли узнать? Нет, не можем. Этот метод возвращает количество байт доступных для чтения в данный момент. Вы сами должны знать свой протокол общения с сервером. Т.е., как уже говорилось, либо сервер в заголовке возвращает количество байт которые он собирается передать, либо есть какая то завершающая последовательность, по которой можно определить что все данные получены. Если вы протокола не знаете, и сервер просто сыпет данные, то остается только предпологать, что все данные получены, например по таймауту. Т.е. если в течении некоторого времени данные больше не поступают, делаем вывод что сервер все передал. Насчет canReadLine то же понятНО тут придется писать while(socket.canReadLine()) который опять может привести к поеданию тактов от чего и уходили. QTcpSocket - предоставляет неблокирующий интерфейс. Т.е. если вы используете сигналы и слоты, никакого блокирования не происходит. Единственное while, как уже сказали, совершенно не нужен. Вызвали в слоте canReadLine(), если возвращает false, просто выходим. Как придут новые данные, попадем снова в наш слот, проверим canReadLine(), если true, считаем строку целиком. Таким образом и ход выполнения программы не останавливается и лишние такты мы не жрём. Так что реализуй пока без отдельных процессов и прочей байды...Не лезь в дебри. Рановато.... А когда тогда не рано? Если никуда не лездь, то ничему и не научишься. Нужно стремиться к новым знаниям |
|
|
Текстовая версия | Сейчас: 29.11.2024, 18:43 |