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

Boost C++ Discussion :

Asio - requete asynchrone, question


Sujet :

Boost C++

  1. #1
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut Asio - requete asynchrone, question
    Hello,

    Je suis attentiovement le travail qu'a fait Gwenael Dunand (http://gwenael-dunand.developpez.com...cpp/boost/asio). par contre, une question concernant les times asynchrone.

    Pour moi, ce que cela signifie, c'est qu'on puisse faire qqch pendant que ca travaille, et que cela ne bloquera pas le script... Mais si je fais ce test:

    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
    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
     
    void print(const boost::system::error_code& /*error*/) // (3)
    {
        std::cout << "Terminé !" << std::endl; // (4)
    }
     
    int main()
    {
        boost::asio::io_service io;
     
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); // (1)
        t.async_wait(print); // Attente asynchrone (2)
     
        io.run();
        std::cout << "En cours !" << std::endl; // (4)
        return 0;
    }
    Pour moi, cela devrait m'afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    En cours !
    Terminé !
    Or cela m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Terminé !
    En cours !
    Donc, une fois le io.run() lancé, il attends bien qu'il soit terminé, et ne poursuit pas le programme... je ne vois aucunes différences, du coup, avec le t.wait du précédent exemple...

    Y a qqch que je ne comprends pas? Ou fait faux?

    merci.
    Onet

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Salut,

    io_service::run() est bloquant, donc l'affichage du programme est normal.
    Si tu veux que ça ne soit pas bloquant, il faut le lancer dans un thread, comme je l'avais suggérer dans l'article.
    Ce qui nous donne :

    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
     
    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <boost/thread.hpp>
    #include <boost/bind.hpp>
     
    void print(const boost::system::error_code& /*error*/) // (3)
    {
        std::cout << "Terminé !" << std::endl; // (4)
    }
     
    int main()
    {
        boost::asio::io_service io;
     
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); // (1)
        t.async_wait(print); // Attente asynchrone (2)
     
        boost::thread my_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io) ) );
        std::cout << "En cours !" << std::endl; // (4)
     
        // On fait une pause sinon ça va quitter !!!
        system("pause");
        return 0;
    }
    Et le tour est joué !

  3. #3
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Ok, donc je suis obligé de passer par un thread...

    Bon, ben je vais continuer dans ce sens, merci de ta réponse. Je vais certainement revenir, au vu du prog que je dois préparer

    Onet

  4. #4
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    petit souci rapide, si tu as 2s:

    J'ai tenté ton code, mais j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    no matching function for call to ‘boost::thread::thread(<unresolved overloaded function 
     type>, const boost::reference_wrapper<boost::asio::io_service>)
    Avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Building file: ../src/test_socket.cpp
    Invoking: GCC C++ Compiler
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test_socket.d" -MT"src/test_socket.d" -o"src/test_socket.o" "../src/test_socket.cpp"
    ../src/test_socket.cpp: In function ‘int main()’:
    ../src/test_socket.cpp:20: erreur: no matching function for call to ‘boost::thread::thread(<unresolved overloaded function type>, const boost::reference_wrapper<boost::asio::io_service>)’
    /usr/local/include/boost/thread/detail/thread.hpp:199: note: candidats sont: boost::thread::thread(boost::detail::thread_move_t<boost::thread>)
    /usr/local/include/boost/thread/detail/thread.hpp:147: note:                 boost::thread::thread()
    /usr/local/include/boost/thread/detail/thread.hpp:118: note:                 boost::thread::thread(boost::detail::thread_data_ptr)
    /usr/local/include/boost/thread/detail/thread.hpp:108: note:                 boost::thread::thread(boost::thread&)
    make: *** [src/test_socket.o] Erreur 1
    Une idée? merci

    Onet

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Zut j'avais oublié le boost::bind.

    Ca marchera mieux comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread my_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io) ) );

  6. #6
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Yep,

    tip top, merci. Ca me donne une bonne base pour ce que j'ai a faire. Je reviendrais surement a toi, sur un autre thread :p. Pars pas en vacance tout de suite

    Onet

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    De rien !
    Citation Envoyé par onet Voir le message
    Pars pas en vacance tout de suite
    C'est pas vraiment prévu !

  8. #8
    Membre éclairé
    Avatar de onet
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    365
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2002
    Messages : 365
    Par défaut
    Parfait lol!

    Bon, j'y retourne, j'ai un serveur/client en tcp-IP non bloquant pour Linux a faire, lol!

    Onet

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

Discussions similaires

  1. Requete cascadée (question de débutant)
    Par boulo dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/07/2008, 11h34
  2. requete imbriquée question basique
    Par pelloq1 dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/05/2008, 00h51
  3. [AJAX] Ajax requete asynchrone multiple
    Par locs dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/05/2008, 19h02
  4. Réponses: 6
    Dernier message: 11/10/2007, 14h13
  5. [DOM] faire une requete asynchrone
    Par gtraxx dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 31/01/2007, 14h22

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