Bonjour,
dans mon projet j'ai deux classes c++ :
- Site
- Page
La class Site a comme membres (entre autre) :
La class Page a comme membres (entre autre) :QHttp *http;
QList<Page *> list_pages;
Dans le constructeur Site::Site, je crée ainsi un nouveau QHttp et j'initialise les connections :QByteArray path;
QBuffer *m_bufOut;
int idreq;
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
6 Site::Site() { http->setHost(host, mode, port); connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(fin_download(int, bool))); }
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é.
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); }
C'est ce qui se passe chez moi, tout marche correctement.
Sauf que j'ai quelque chose du genre :
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.
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"); } } }
En effet je lance plusieurs requêtes http get dans mon code,
j'ai une association idreq <==> Page, grâce à cette affectation :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 page->idreq = http->get(page->path, page->m_bufOut);
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
Partager