Bonjour,

dans mon projet j'ai deux classes c++ :
- Site
- Page

La class Site a comme membres (entre autre) :

QHttp *http;
QList<Page *> list_pages;
La class Page a comme membres (entre autre) :

QByteArray path;
QBuffer *m_bufOut;
int idreq;
Dans le constructeur Site::Site, je crée ainsi un nouveau QHttp et j'initialise les connections :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Site::Site()
{
   http->setHost(host, mode, port);
   connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(fin_download(int, bool)));
}
La class Site a aussi une méthode qui se charge de downloader une page, quelque chose du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
void Site::download_page(Page *page)
{
   page->idreq = http->get(page->path, page->m_bufOut); 
}
http->get d'après la doc de QT fonctionne de manière asynchrone, donc un signal est émit lorsqu'une requête se termine : le signal requestFinished(int, bool) et le slot fin_download() est appelé.

C'est ce qui se passe chez moi, tout marche correctement.

Sauf que j'ai quelque chose du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void Site::fin_download(int id,bool error)
{
   foreach(Page *tmp,list_pages)
   {
       if(page->idreq == id) 
       {
             affiche("la page  "+page->m_bufOut+" a été téléchargée");
        }
   }
}
comme vous le voyez, je suis obligé de parcourir toute ma liste de Page * pour "retrouver" quel est la Page * qui correspond à l'id de la requete qui vient de se terminer.

En effet je lance plusieurs requêtes http get dans mon code,
j'ai une association idreq <==> Page, grâce à cette affectation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
page->idreq = http->get(page->path, page->m_bufOut);
oui mais une fois dans le SLOT fin_download(int id,bool error) cette association n'existe plus et je suis obligé de faire un parcourt de liste.

C'est pas pratique et je me demande si j'ai pas rater quelque chose ?
un problème de structure global de mon programme ou une fonctionnalité de qt que je n'utilise pas ?

Bien sur je pourrais déplacer le QHttp *http dans la classe Page et tout faire dans le constructeur de Page, oui mais si je dois faire un

setHost(...);
connect(...);

En plus de la création de l'objet QHttp pour CHAQUE requête je ne profiterai pas du protocole http 1.1 ? je me reconnecterai au site à chaque requête sur celui ci, ce que je ne souhaite pas faire, j'aimerai faire UN setHost pour chaque Site (je suppose que QT se débrouille pour maintenir la connection) et pour chaque Page faire un get().

merci