crossplatform.ru

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

5 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> Ожидание чтения и сокращение загрузки процессора.
dasV
  опции профиля:
сообщение 13.3.2009, 22:16
Сообщение #11


Студент
*

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

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




Репутация:   0  


А я и не говорил что нельзя, мне просто неудобно, из за непонимания логики работы программы при использовании слотов.

Мне необходимо допустим три раза вызвать запись, три раза прочитать и при этом каждый раз я получаю разные данные, которые необходимо обработать разными методами. В результате я не понимаю, что мне надо делать в при вызове слота readyRead, откуда вызвано, куда что передавать,… понятно когда GUI приложение, жмякнул на кнпку (соединится) я соединился, жмякнул на кпопку (Послать) я и послал, жмякнул выход я рас соединился.

А в консоли, что мне делать?? Я все и по порядку и делаю, при этом смысла в слотах я не вижу.

2_LE0N спасибо, буду думать..
2_Litkevich Yuriy спасибо за замечание, буду отвыкать.

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


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

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

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




Репутация:   23  


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

я решил что кто то или что то ограничило пути решения.
все таки в толк не возьму в чем разница консольное приложение или гуёвое в гуёвом понятно в консольном не понятно...как так?
давай разбираться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.3.2009, 22:32
Сообщение #13


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

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

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




Репутация:   94  


Цитата(dasV @ 14.3.2009, 1:16) *
А в консоли, что мне делать?? Я все и по порядку и делаю, при этом смысла в слотах я не вижу.
ну в консоли же не умерает объектно-ориентированное програмирование. У меня есть программа консольная которая опрашивает аппаратуру через COM-порт, сигналы и слоты мне очень помогли, без них было бы мение удобно работать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 14.3.2009, 20:01
Сообщение #14


Студент
*

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

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




Репутация:   0  


Задача такова, я должен послать на сервер запрос авторизации, сервер мне ответит (тут я должен распарсить что он мне ответил) если это нормальный ответ, я посылаю запрос на выдачу мне нужной информации, при этом сервер мне отвечает xml строкой где я ищу нужные мне строки, вывожу на экран и опять посылаю запрос на закрытие соединения, опять ответ опять корректно закрыли или нет. Это простейший случай который реализован без Q_OBJECT шаг за шагом.

В результате я не могу понять ну вот я в конструкторе или в другом месте создал
QObject::connect(&socket, SIGNAL(encrypted()),this, SLOT(socketEncrypted()));
QObject::connect(&socket, SIGNAL(readyRead()),this, SLOT(socketReadyRead()));
    
set_encrypted_connect(); //socket.connectToHostEncrypted(ssl_host,ssl_port);


В результате после соединения с хостом я вызову
socket.write(get.toUtf8()+ "\r\n"); //тут get="GET что то там ";


А после будет получен сигнал readyRead() который вызовет слот socketReadyRead() в результате будет прочитана строка socket.readAll() “Я получаю ответ от сервера и допустим …ура!!! Все хорошо!!” а дальше что?? Как мне указать программе, что пора получать данные, после чего закрыть соединение??
Ну допустим я после чтения в функии socketReadyRead опять сделаю запрос

socket.write(get.toUtf8()+ "\r\n");

Но после этого опять будет вызван socketReadyRead() и так по кругу… вот тут меня и клинит!!!


Может книгу порекомендуете ?? С удовольствием почитаю =)

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


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

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

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




Репутация:   23  


dasV,
существует такой метод или "агрегат" униерсальный для таих задач. называется машина состояний.
есть состояния твоей проги. есть состояния сокета есть состояния данных и т.д и т.п..
состояния это обычно перечисляемый тип. и переменная в классе. в зависимости от действий в программе переключай состояния. при событиях проверяй в каком состоянии находишься и действуй.
Цитата(dasV @ 14.3.2009, 20:01) *
А после будет получен сигнал readyRead() который вызовет слот socketReadyRead()

не пойму почему он вызовется. он вызывается не в тот момент когда сокет свободен а когда с другой стороны в него данные послали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 14.3.2009, 20:54
Сообщение #16


Студент
*

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

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




Репутация:   0  


2_ kwisp Спасибо, буду думать, а это не оно ли случаем?
http://ru.wikipedia.org/wiki/Автоматное_программирование

Насчет, почему вызовется, потому как мы сделали socket.write при этом сервер нам будет возвращать данные, чего мы и ожидаем, ну по крайней мере в примерах именно так реализовано.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 15.3.2009, 9:16
Сообщение #17


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

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

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




Репутация:   23  


Цитата(dasV @ 14.3.2009, 20:54) *
а это не оно ли случаем?

да оно. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
dasV
  опции профиля:
сообщение 26.3.2009, 19:33
Сообщение #18


Студент
*

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


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

Группа: Сомодератор
Сообщений: 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]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 27.3.2009, 0:44
Сообщение #20


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

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

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




Репутация:   29  


Дополнительно(конкретно по вопроссу)
Цитата(dasV @ 26.3.2009, 19:33) *
второй раз, данные записать не удается. Точнее функция возвращает мне количество записанных данных, однако на деле ничего на сервер не приходит.

Добавьте
socket.flush();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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