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
  опции профиля:
сообщение 26.3.2009, 19:33
Сообщение #2


Студент
*

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

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




Репутация:   0  


Доброго времени суток уважаемые.
Сделал как и сказано было, однако возникла проблема, если первый раз я произвожу запись из функции socketEncrypted() после чего читаю вполне нормально данные полученные от сервера, то второй раз, данные записать не удается. Точнее функция возвращает мне количество записанных данных, однако на деле ничего на сервер не приходит.

Может кто то сталкивался с такой проблемой?
Раскрывающийся текст

void ssl_class::socketReadyRead()
{

    QString tmp;
    bool ok;
    int i; // он вообще то не оч нужен, но так..пусть будет =)

    switch(state)
    {
       case StartSession:
       {
        tmp=xmlParser(socket.readAll());
        SessionID=tmp.toInt(&ok, 10);
        if(!ok)
        {
            if(SessionID<=0)
            {
                //MSG : ошибка логин или пароль, не верны
                emit finish();
            }
        }
        tmp="GET "+get+"/CloseSession?SessionID="+ QString::number(SessionID)+" \r\n";
        i = socket.write(tmp.toUtf8());

        if(i==-1)
        {
            //MSG : Ошибка при записи
        }
        else
        {
            //MSG : записали много байт
        }

        state=CloseSession;

           break;
       }

       case CloseSession:
       {
            tmp=xmlParser(socket.readAll());
            SessionID=tmp.toInt(&ok, 10);
            if(!ok)
            {
                if(SessionID==0)
                {
                    //MSG : все хорошо
                }
            }
            emit finish();
           break;
       }
    }
}




Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 26.3.2009, 23:51
Сообщение #3


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Может я уже немного не в тему и не вовремя, но я бы использовал другую конструкцию. Предлогалось уже использовать сигналы и слоты, так и не понял почему этого не сделали. Я бы использовал следущую конструкцию:

Создал свой класс, наследник от QThread:
class ThreadSocket : public QThread
{
    Q_OBJECT
    
    ...
    QTcpSocket *socket;
    QMutex mutex;
    QWaitCondition cond;
    QByteArray DataIn;
    ...    
protected:
    void run();
    ...

private slots:
    void readSocket();
    ...
}


Переопредилил Run следущим образом:
void ThreadSocket::run()
{
    const int Timeout = 6 * 1000;
    
    emit SendServer("first_command"); // отправляем данные для записи в соккет
    mutex.lock();
    if ( cond.wait(&mutex, Timeout) ) { // ожидаем ответ. Если получили, разбираем данные и отправляем след. команду
        ... //  разбираем данные, в общем любые требуемые действия.
        DataIn.clear();
        
        emit SendServer("second_command"); // отправляем данные для записи в соккет
        if ( cond.wait(&mutex, Timeout) ) {// ожидаем ответ.
            ... //  разбираем данные, в общем любые требуемые действия.
            DataIn.clear();
            
            // и т.д.
            ...
            ...
            ...
            ...
            
        } else {
            emit displayMessage("Timeout №2"); // отправляем сообщение об ошибке.
        }
    } else {
        emit displayMessage("Timeout №1"); // отправляем сообщение об ошибке.
    }
    mutex.unlock();
            ...
}



SLOT. Чтение динных с сервера:
void ThreadSocket::readSocket()
{
    if ( socket->canReadLine() ) {
        mutex.lock(); // -----------------------
        DataIn = DataIn + socket.readAll();//     |   mutex здесь впринципе не нужен )))
        mutex.unlock(); //-----------------------
        cond.wakeOne();
    }
}


Надеюсь мысль понятна :rolleyes:


[offtop]
Простите, но почему я не могу редактировать сообщения?
И как сделать Раскрывающийся текст. А то я обрамил все в тег "Скрытый текст", думал что это оно, теперь и не знаю, читается ли код?
[\offtop]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




RSS Текстовая версия Сейчас: 29.11.2024, 18:39