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

Multithreading Discussion :

Problème de conception


Sujet :

Multithreading

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut Problème de conception
    Bonjour,

    Je viens faire appel à vous, car je me retrouve face à un problème de conception que je ne parviens pas à régler. Je pense que du code serait inutile ici, c'est plus la théorie qui me pose problème.

    Alors voilà, j'ai une application qui tourne.
    Je veux créer une deuxième fenêtre en cliquant sur un bouton, dans laquelle on pourra observer un visuel quelconque, (rendu, vidéo... peu importe)

    Il y a deux choses qui m'importent : Garder la main sur l'application lorsque la deuxième fenêtre est lancée. et faire en sorte dans cette fenêtre d'avoir un bouton permettant de stopper le rendu et de pouvoir le reprendre lorsque l'utilisateur le souhaite.

    Pour répondre à ce deuxième problème, j'ai scindé ma fenêtre en deux classes. Une première dérivant de QWidget affichant ce que je souhaite(appelons la QWi), et qui contient une instance de ma deuxième classe, qui elle dérive de QThread (appelons la QTh).
    Cette dernière est chargée de réaliser les calculs nécessaires à l'affichage.
    Jusqu'ici pas de problème tout cela fonctionne convenablement.

    Mais voila, le bouton que j'ai mis dans ma classe QW est incliquable. Il devient cliquable uniquement lorsque l'objet QTh a terminé sa tâche... Or c'est justement ce problème que je voulais contourner...

    Si quelqu'un a une petite idée, car la, je commence à patauger... Une idée aussi pour faire en sorte de pouvoir récupérer la main sur l'application principale une fois mon instance de QW lancée ?


    Dans tous les cas, je vous serais très reconnaissant

    Merci,
    Az

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Bon, j'ai essayé une nouvelle technique.
    Je crée ma nouvelle fenêtre myWidget, et j'essaye de créer un nouveau Thread afin de faire un moveToThread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QThread * myThread;
    myThread = new QThread();
     
    myWidget->moveToThread(myThread);
     
    myThread->start();
    Seulement voilà, j'ai cette erreur lors de l'éxecution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject::moveToThread: Widgets cannot be moved to a new thread
    C'est assez étrange, j'ai du mal à comprendre qu'on ne puisse pas lancé un nouveau Widget ou une nouvelle fenêtre de cette manière.

    Je vais donc tester de créer une sous classe de QThread qui s'occuppe de tout lancer, mais cela rejoint à ce que j'ai fais précédemment, et cela risque de ne pas marcher... :/

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Pas de GUI dans les threads. Un peu de lecture Les threads sans maux de tête et Vous vous y prenez mal...
    Il n'y a que le calcul qui doit être déporté dans le trhead

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Oui, j'ai pourtant bien lus ces deux bouts de FAQ, mais ils ne m'ont pas permis de comprendre comme faire pour pouvoir lancer une deuxième fenêtre, tout en gardant le contrôle sur la première :/. Un peu à la manière d'une application démarrée avec QProccess...

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    en fait, lorsque tu as 2 fenêtres d'ouvert, tu peux normalement cliquer sur les 2 fenêtres et elles restent accessibles. Donc, il faut juste déporter ton code de calcul dans le thread, rien d'autres.

    Peut être prendre comme exemple ce qui se fait avec OpenGL : OpenGL threadé dans Qt 4.8 et Apercevoir la troisième dimension

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Donc, il faut juste déporter ton code de calcul dans le thread, rien d'autres.
    Le hic, c'est que c'est bien ce que j'ai essayé de faire. Ma première classe dérive de QWidget appelle le Thread qui lui s'occupe et des calculs, et de déssiner dans une Pixmap (jusque là, pas de soucis de GUI) que j'envoie par signal à mon Widget. les pixmap sont bien recues et déssinées, mais. Mon Widget comporte également un bouton qui lui est incliquable... Impossible donc de mettre mon Thread en pause avant qu'il soit terminé... Ma fenêtre principale et son QWidgets restent donc toutes deux bien figées...

    Je vais regarder du côté des liens que tu m'as filé..

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ok, donc on est en face d'un problème d'implémentation, pas de conception. Il nous faudrait du code alors (création de la fenêtre, création du thread, etc.)

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Soit, alors voici le code pour ma classe dérivée de QWidget :

    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
    Widget::Widget() : QWidget()
    {
        myButton = new Button(...);
        myButton->show();
     
        setGeometry(...);
     
        MyThread = new Thread(...);
        connect(MyThread, signal_Draw(QPixmap), this, slot_draw(QPixmap));
    }
     
    Widget::~Widget()
    {
        delete MyThread;
    }
     
    void Widget::Begin_Thread()
    {
        MyThread->start();
    }
     
    void Widget::slot_draw(QPixmap)
    {
        // stocke la QPixmap
        ...
     
        // Appel implicite à la fonction qui dessinera la Pixmap grace au PaintEvent
        repaint();
    }
    Code de la classe Thread :

    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
    Thread::Thread()
    {
        // Initialisation des paramètres
    }
     
    void Thread::run()
    {
        for(iter < Num_iterations)
        {
            QPixmap mypix;
     
            //dessine dans mypix
     
            emit signal_Draw(myPix);
        }
    }
    Voilà pour le code utile synthétisé.
    Dans Le Widget principal, est fait cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Widget* MyWidget;
    MyWidget = new Widget();
     
    MyWidget->show();
    MyWidget->Begin_Thread();
    A cet endroit là, le Thread est implicitement appelé, il fait correctement son travail, et renvoie ce qu'il faut au Widget qui s'occupe de l'affichage... Mais en restant figé

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    QPixamp est une classe GUI. Il te fau tutilisé des QImage pour les thread.

    Comment fait tu pour arrêter ta boucle?

    Mais en restant figé
    C'est à dire?

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par yan Voir le message
    QPixamp est une classe GUI. Il te fau tutilisé des QImage pour les thread
    Tu es sur de ce point ? QPixmap et Qimage dérivent tout les 2 QPaintDevice, il n'y a pas a priori de différence entre ces classes concernant les threads et j'ai pas trouvé d'information dans la doc interdisant de les utiliser dans les threads. Tu as une source là dessus ?
    Par contre, il est vrai que l'exemple de la doc utilise bien QImage : http://qt.developpez.com/doc/4.7/threads-mandelbrot/

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Tu es sur de ce point ? QPixmap et Qimage dérivent tout les 2 QPaintDevice, il n'y a pas a priori de différence entre ces classes concernant les threads et j'ai pas trouvé d'information dans la doc interdisant de les utiliser dans les threads. Tu as une source là dessus ?
    Par contre, il est vrai que l'exemple de la doc utilise bien QImage : http://qt.developpez.com/doc/4.7/threads-mandelbrot/
    Sur et certain :p

    http://qt-project.org/doc/qt-4.8/thr...ing-in-threads

    QPixmap est une surcouche d'instance GUI pour afficher une image.

  12. #12
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    emit signal_Draw(myPix);
    Ton signal est émis pas QThread, qui n'appartient pas au même thread que le code contenu dans la fonction run. Pour faire cela, il faut créer un QObject dans run et l'utiliser pour émettre des signaux.

    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
    class Sender : public QObject {
        Q_OBJECT
    public:
        void emit(QPixmap pixmap) { emit draw(pixmap); }
    signals:
        void draw(QPixmap pixmap);
    };
     
    void Thread::run()
    {
        Sender* sender = new Sender;
        connect(sender, SIGNAL(draw(QPixmap)), widget, SLOT(slot_draw(QPixmap));
     
        for(iter < Num_iterations)
        {
            QPixmap mypix;
            //dessine dans mypix
            sender.emit(myPix);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(MyThread, signal_Draw(QPixmap), this, slot_draw(QPixmap));
    utilise les macros SIGNAL() et SLOT()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(MyThread, SIGNAL(signal_Draw(QPixmap)), this, SLOT(slot_draw(QPixmap)));

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par yan Voir le message
    Sur et certain :p

    http://qt-project.org/doc/qt-4.8/thr...ing-in-threads

    QPixmap est une surcouche d'instance GUI pour afficher une image.
    bien vu, j'avais du lire ça il y a longtemps, ça m'était sorti de la tête (j'utilise en général swapBuffer(), pas le dessin directe dans une image)

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par yan Voir le message
    Salut.
    QPixamp est une classe GUI. Il te fau tutilisé des QImage pour les thread.

    Comment fait tu pour arrêter ta boucle?


    C'est à dire?
    Pour les QImage, je vais voir, mais étonnemment, cela fonctionne de cette manière et je n'ai pas d'erreur à l'execution de type de celle que j'ai eu en voulant mettre un QWidget dans le Thread

    Sinon, Le Thread n'est pas en boucle infinie. Je voulais pouvoir l'arrêter avec un bouton dans mon QWidget, seulement celui si n'est pas cliquable et c'est ce que je veux dire par le fait que mon application soit figé. Je ne peux plus intéragir avec elle tant que le QWidget n'a pas fini son travail....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utilise les macros SIGNAL() et SLOT()
    Euh oui, c'est déjà le cas, c'est juste que j'ai du retranscrire tout le code et qtcreator ne veut rien mettre dans le presse papier, donc des ptites erreurs se sont ptêtre glissées.

    Je m'en vais donc essayer cette astuce avec QObject, je vous tiens au courant.

    Merci Beaucoup !

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Ton signal est émis pas QThread, qui n'appartient pas au même thread que le code contenu dans la fonction run.
    Les signaux sont thread safe et ne pose aucun problème. C'est au niveau du slot qui faut faire attention

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Widget::slot_draw(QPixmap)
    {
        // stocke la QPixmap
        ...
     
        // Appel implicite à la fonction qui dessinera la Pixmap grace au PaintEvent
        repaint();
    }
    remplace repaint par update pour voir?
    http://qt-project.org/doc/qt-4.8/qwidget.html#update

  17. #17
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par yan Voir le message
    Les signaux sont thread safe et ne pose aucun problème. C'est au niveau du slot qui faut faire attention
    Hum, j'avais un doute, je ne savais plus si c'était pour les signaux ou les slots qu'il fallait créer une QObject (ou les 2). Si tu le dis, je te fais confiance (et du coup, je vais me taire, parce que ça fait beaucoup de post que je dis n'importe quoi )

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Hum, j'avais un doute, je ne savais plus si c'était pour les signaux ou les slots qu'il fallait créer une QObject (ou les 2). Si tu le dis, je te fais confiance (et du coup, je vais me taire, parce que ça fait beaucoup de post que je dis n'importe quoi )
    Pour les signaux, c'est dans la FAQ :p
    http://qt.developpez.com/faq/?page=T...connect-thread

    Pour QPixmap, faut trouvez l'information(j'ai du cherche dans la doc 4.6 pour retrouver le paragraph )... Surtout que ca tombe en marche sous windows et crash sous linux
    Il me semblais qu'il y avais une QR

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Ca y est, j'ai réglé mon problème, avec vos solutions combinées à savoir, l'utilisation d'un Sender ainsi que de QImage à la place des QPixmaps, qui effectivement ne pouvaient pas fonctionner (pourquoi ca a marché un temps, ca je ne comprends pas...).

    Désormais, je peux garder la main sur le Thread principal et j'ai bien l'affichage que je souhaite dans mon Widget.

    Seul hic, j'enregistre également mes images sur disque et elles ont parfois des problèmes (comme si les Images étaient entrecoupées horizontalement). J'ai d'abord pensé à un problème de synchronisation du fait que la connection soit asynchrone, mais une attente de 50ms entre chaque frame ne modifie rien. Est-ce que cela peut tout de même être cela ?

    J'essaye de chercher sur la synchronisation de la communication entre Threads.

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par 0_Azerty_0 Voir le message
    Seul hic, j'enregistre également mes images sur disque et elles ont parfois des problèmes (comme si les Images étaient entrecoupées horizontalement). J'ai d'abord pensé à un problème de synchronisation du fait que la connection soit asynchrone, mais une attente de 50ms entre chaque frame ne modifie rien. Est-ce que cela peut tout de même être cela ?
    Qui enregistre la QImage? que fait tu passer en paramètre de ton signal?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 11h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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