Russian Qt Forum

Qt => Работа с сетью => Тема начата: SimpleSunny от Сентябрь 22, 2009, 13:39



Название: QNetworkAccessManager. Правильно организовать работу с сетью.
Отправлено: SimpleSunny от Сентябрь 22, 2009, 13:39
Есть программа, которая посылает на сервер различные (GET, HEAD, POST) запросы и в зависимости от ответа сервера выполняет те или иные действия на сервере.
Сейчас работа организована как-то так:
Код
C++ (Qt)
enum TypeRequest{Req1, Req2, Req3};
TypeRequest typeRequest;
 
void finished(QNetworkReply *reply)
{
switch (typeRequest)
{
case Req1 : do1(reply);
break;
case Req2 : do2(reply);
break;
case Req3 : do3(reply);
break;
}
}
 

Есть ли более изящные методы организации работы?


Название: Re: QNetworkAccessManager. Правильно организовать работу с сетью.
Отправлено: BRE от Сентябрь 22, 2009, 15:08
Как вариант.
Код
C++ (Qt)
class BaseRequest : public QObject
{
Q_OBJECT
public:
BaseRequest( QNetworkAccessManager *manager, QObject *parent = 0 );
 
// Запустить запрос
bool start()
{
m_reply = build();
if( !m_reply )
return false;
connect( m_reply, SIGNAL( finished() ), SLOT( slotFinished() ) );
return true;
}
 
protected:
// Создать и выполнить запрос, вернуть объект reply
virtual QNetworkReply *build() = 0;
// Обработать ответ
virtual void processReply( QNetworkReply *reply ) = 0;
 
protected slots:
void slotFinished()
{
processReply( m_reply );
}
 
protected:
QNetworkAccessManager *m_manager;
QNetworkReply *m_reply;
};
 
class Req1 : public BaseRequest
{
Q_OBJECT
protected:
QNetworkReply *build()
{
return m_manager->get( ... );
}
 
void processReply( QNetworkReply *reply )
{
// Обработали запрос
}
};
 
class Req2 : public BaseRequest
{
...
};
 
Для запуска запроса, нужно создать объект соответсвующего класса, настроить его и запустить start(). Когда будет получен ответ, сам объект запроса обработает его и если нужно разрушит (например вызвав deleteLater).


Название: Re: QNetworkAccessManager. Правильно организовать работу с сетью.
Отправлено: SimpleSunny от Сентябрь 24, 2009, 00:43
СПасибо. БУду вникать.