IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

QHttp et le signal requestFinished(int, bool)


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 87
    Points : 46
    Points
    46
    Par défaut QHttp et le signal requestFinished(int, bool)
    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

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ne suis pas sur d'avoir compris le problème. Mais du moins pour "éviter" le parcours de toute les pages de la liste, je pense que la solution serait d'utiliser une structure plus du genre de QMap ( QHash ? ). Celle ci permettra d'associer l'id comme identifiant ( clé ). En accédant à la QMap par cette clé vous tomberai directement sur la page que vous voulez.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Type primitif (int, bool) ou type du CTS (Int32, Boolean)
    Par Yoshio dans le forum Général Dotnet
    Réponses: 31
    Dernier message: 06/02/2008, 19h25
  2. convertir bool en int ?
    Par Emcy dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 02/02/2007, 11h27
  3. Réponses: 3
    Dernier message: 27/08/2006, 14h25
  4. int, unsigned char ou bool ?
    Par BNS dans le forum C++
    Réponses: 10
    Dernier message: 21/06/2006, 21h59
  5. Réponses: 8
    Dernier message: 01/03/2005, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo