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 :

Exécuter une fonction toutes les X minutes ?


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut Exécuter une fonction toutes les X minutes ?
    Bonjour,

    je voudrais avoir un avis et un conseil.

    je voudrais faire ceci :
    => On ouvre une fenêtre du programme.
    => On rempli ses infos d'identification on se connecte au site via QHttp.
    => On récupère en même temps que la requête de connexion les dernières infos pour savoir s'il y a eu du mouvement depuis (sous forme XML).
    => On traite les infos XML reçu avec les fonction QDom*
    => On les affiches.
    => On refait la même requete toutes les X minutes. (choisis par moi :p )

    Il faut fermer la connexion et la ré-ouvrir à chaque fois !?

    Donc voilà je ne sais pas trop comment faire la fin surtout.

    Merci !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Points : 64
    Points
    64
    Par défaut
    Je ne connais pas Qhttp et QDom mais il me semble que je pourrais t'aider :

    tu pourrais déclarer un timer qui appelle régulièrement une fonction updateInfos()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateInfos()));
    Dans le slot updateInfos(); on retrouve la requête à exécuter régulièrement ainsi que les fonctions de traitement de la réponse et de mise à jour de l'IHM

    tu démarre effectivement le timer, MS étant l'intervalle en millisecondes entre chaque tick du timer
    Il faut fermer la connexion et la ré-ouvrir à chaque fois !?
    a priori tu ouvres la connexion une fois et tant qu'elle n'est pas fermée, pas besoin de la réouvrir...

    Pour plus d'infos : http://qt.developpez.com/doc/4.4/qtimer/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    J'ai vu aussi QThread est aussi bien que QTimer ou mieux ?

  4. #4
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Utilisant le QTimer(), je n'ai aucun souci, pourtant je travaille sur du 40ms en exécutant pas mal de lignes de codes à chaque fois.

    Maintenant QThread() devrait bien fonctionner aussi, et je suppose que tu peux faire la même chose avec les deux.

    Au vu de l'utilisation que tu veux en faire, peut être que QTimer() est plus facile à implémenter.

    A mon avis, regarde la doc des deux, tu verra peut être une méthode que tu veux ou voudra utiliser.

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    QTimer colle parfaitement à tes besoins, pas besoin de sortir quelque chose de plus lourd. La puissance des signaux/slots de Qt te rend la tâche d'autant plus facile

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    OK merci je vais voir ça !

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Voilà je viens de finir ce petit problème avec QTimer.

    J'ai un petit souci maintenant mes balises XML contienne une balise "connecte" qui dit que le membre est bien connecté au site.

    Le souci c'est que quand on fait la première requête HTTP ça fonctionne très bien on affiche bien la balise comme quoi on est bien connecté. Jusque là tout va bien.

    Mais le souci c'est toutes les autres requêtes HTTP qui vont suivre afficherons qu'on est bien connecté... Or ça sert strictement à rien ici...

    Donc je voudrais savoir comment je peux faire pour faire en sorte que la balise "connecte" soit affiché que lors de la première requête HTTP ?

    Voici mon code complet qui fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    void Tool::on_pushButton_connection_clicked()
    {
        http = new QHttp(this); // variable de la class Http
     
        connect(http, SIGNAL(done(bool)), this, SLOT(affiche(bool)));
        connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(fin(int, bool)));
     
        QHttpRequestHeader header("POST", "/page.php");
        header.setValue("Host", "www.site.fr");
     
        http->setHost("www.site.fr");
        header.setValue( "User-Agent", "User Agent");
        header.setContentType("application/x-www-form-urlencoded");
     
        QString PostVariable ="username=";
        PostVariable+=uiConfig.lineEdit_2->text();
        PostVariable+="&password=";
        PostVariable+=QCryptographicHash::hash(uiConfig.lineEdit->text().toUtf8(),QCryptographicHash::Sha1).toHex();
     
        http->request(header,PostVariable.toUtf8());
    }
     
    void Tool::fin(int _id, bool _error)
    {
        if(_error)
            QMessageBox::information(0, "Fin", QString().setNum(http->error()));
    }
     
    void Tool::affiche(bool)
    {
        QDomDocument infos;
        QString errorStr;
        int errorLine;
        int errorColumn;
        QByteArray content = http->readAll();
        if (!infos.setContent(content, true, &errorStr, &errorLine, &errorColumn))
        {
            qDebug() << "Error parsing session file";
            qDebug() << content;  return;
        }
     
        QDomElement element = infos.documentElement();
        for(QDomNode n = element.firstChild();
        !n.isNull();
        n = n.nextSibling())
        {
            QDomElement e = n.toElement();
            qDebug() << e.tagName() << e.text();
     
            QPopup *t = new QPopup(200,200,1);
            t->Show(QString("Programme"), QString(e.text()),5000);
     
            if( e.tagName() == "connecte" )
            {
                QTimer *timer = new QTimer(this);
                connect(timer, SIGNAL(timeout()), this, SLOT(requete_http()));
                timer->start(420000); // 10 minutes = 600000 millisecondes
            }
        }
    }
     
    void Tool::requete_http()
    {
            //SI on a récupéré la balise xml <connecte></connecte> alors
            //exécute une requete toutes les x minutes
     
            QString PSEUDO = "dsfsdfsfd";
            QString MDP = "sefsef";
     
            http = new QHttp(this);
     
            connect(http, SIGNAL(done(bool)), this, SLOT(affiche(bool)));
            connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(fin(int, bool)));
     
            QHttpRequestHeader header("POST", "/page.php");
            header.setValue("Host", "www.site.fr");
     
            http->setHost("www.site.fr");
            header.setValue( "User-Agent", "User Agent");
            header.setContentType("application/x-www-form-urlencoded");
     
            QString PostVariable ="username=";
            PostVariable+=PSEUDO;
            PostVariable+="&password=";
            PostVariable+=MDP;
     
            http->request(header,PostVariable.toUtf8());
    }
    Merci !

  8. #8
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Bah, tu stockes un flag dans ta classe que tu bascules après la première connexion. Ensuite, tu ignores la balise, et basta.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 264
    Points : 52
    Points
    52
    Par défaut
    Ok merci je vais creuser vers cette piste.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. exécuter une fonction tout les xx secondes
    Par med.doc dans le forum C++
    Réponses: 26
    Dernier message: 26/09/2013, 23h10
  2. Exécuter une fonction toutes les 2 minutes en VB.NET
    Par sihammaster dans le forum VB.NET
    Réponses: 3
    Dernier message: 14/10/2012, 00h29
  3. Exécuter une fonction toutes les 2ms
    Par ditchou dans le forum Langage
    Réponses: 3
    Dernier message: 08/02/2008, 17h54
  4. Executer une fonction tout les X minutes
    Par Fabouney dans le forum C
    Réponses: 6
    Dernier message: 07/08/2006, 19h33
  5. Réponses: 9
    Dernier message: 14/12/2005, 21h05

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