crossplatform.ru

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

5 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Ожидание чтения и сокращение загрузки процессора.
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()???

С уважением
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 13.3.2009, 17:52
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


dasV,
что мешает включить в конольную прогу Q_OBJECT ???
и использовать для чтения сокета сигналы и слоты тогда можно.
Цитата(dasV @ 13.3.2009, 17:47) *
к месту ли тут QCoreApplication::processEvents()???

точно нет в этой ситуации.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 17:56
Сообщение #3


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

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

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




Репутация:   94  


dasV, цыклы лучше в отдельный поток помещать у них приоритет задать можно.

Цитата(kwisp @ 13.3.2009, 20:52) *
точно нет в этой ситуации.
если человуку захочется программу закрыть, окно командной строки, то без этой строчки невыйдет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 13.3.2009, 17:56
Сообщение #4


Студент
*

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

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




Репутация:   0  


virtual bool waitForReadyRead ( int msecs = 30000 )
Как ты думаешь...А зачем там задан параметр msecs ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 13.3.2009, 19:24
Сообщение #5


Студент
*

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

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




Репутация:   0  


Хм, написал вот что

QString Sms_class::ReadSocket()
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("CP-1251"));
    QTextCodec *concodec = QTextCodec::codecForName("CP-866");
    QTextStream out(stdout);
    out.setCodec(concodec);

    QTime TimeOut;
    TimeOut.start();
    
    if(socket.waitForReadyRead(60000)==false)
        {    out<<"MSG : Time - "<<TimeOut.elapsed()<<endl;
            return(0);
        }
    out<<"MSG : Time - "<<TimeOut.elapsed()<<endl;
    return(socket.readAll());
}


Результат работы

MSG : Write GET //запрос и переход на ожидание ответа
MSG : Wait response from server
MSG : Time – 5598 // то есть мы ждали но дождались ответа
**** Тут могла быть Ваша реклама****
MSG : Write GET // опять запрос и переход на ожидание ответа
MSG : Time – 10 // фактически не ждали, сразу выдали таймаут
MSG : Error CloseSession! //тут должен быть ответ, то есть некое число

Но из за
tmp=ReadSocket();

    if(tmp.isNull ()==true)
    {
        out<<"MSG : Error CloseSession!!"<<tmp<<endl;
        return(false);
    }

В вызывающей функции числа нет, следна это не 0 а именно «string is null»

Может я, что то не углядел?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 13.3.2009, 19:51
Сообщение #6


Студент
*

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

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




Репутация:   0  


QString QIODevice::errorString () const ?
Кто должен отлаживать, ты или МЫ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 20:24
Сообщение #7


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

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

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




Репутация:   94  


Цитата(dasV @ 13.3.2009, 22:24) *
if(tmp.isNull ()==true)
отвыкай от этой записи, сравнение с булевой константой излишне и некрасиво

Цитата(dasV @ 13.3.2009, 22:24) *
следна это не 0 а именно «string is null»
переменная tmp какого типа?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 13.3.2009, 20:25
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Litkevich Yuriy @ 13.3.2009, 17:56) *
если человуку захочется программу закрыть, окно командной строки, то без этой строчки невыйдет.

там же таймаут вроде есть. должно по Ctrl-C завершиться. хотя если есть в программе корректный выход то его не заюзаешь.

а так вообще не пояснено почему сигналы и слоты использовать нельзя..
почему???

Цитата(Litkevich Yuriy @ 13.3.2009, 20:24) *
переменная tmp какого типа?

Цитата(dasV @ 13.3.2009, 19:24) *
tmp=ReadSocket();
Цитата(dasV @ 13.3.2009, 19:24) *
QString Sms_class::ReadSocket()

QString получается.

Сообщение отредактировал kwisp - 13.3.2009, 20:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 20:26
Сообщение #9


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

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

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




Репутация:   94  


Цитата(kwisp @ 13.3.2009, 23:24) *
должно по Ctrl-C завершиться
если их будет кому обрабатывать.

Цитата(kwisp @ 13.3.2009, 23:24) *
а так вообще не пояснено почему сигналы и слоты использовать нельзя..
почему???
согласен лучше сразу похорошему делать, потом работы будет меньше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 13.3.2009, 20:33
Сообщение #10


Студент
*

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

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




Репутация:   0  


Цитата
переменная tmp какого типа?

Очевидно же - QByteArray ))

Сообщение отредактировал LE0N - 13.3.2009, 21:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 2:52