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 :

Threads Qt [QThread]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Tom487
    Homme Profil pro
    Étudiant informatique
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut Threads Qt
    Bonjour à tous,

    Je développe actuellement une application client/serveur avec QT.
    J'ai déporté la réception et l'envoi de trames dans des threads créées par mon application (qu'elle soit le client ou le serveur ne change rien).

    Mon problème vient du faite que j'aimerais créer ma QUdpSocket * dans mon application, puis que mon thread l'utilise afin d'envoyer ou de recevoir des paquets. Pour ensuite mourir et être remplacé par un autre thread qui utilisera cette même socket et ainsi de suite (le but est ici de garder la socket d'une fois sur l'autre afin de ne pas créer une nouvelle socket à chaque threads).
    Lorsque je fais cela, j'ai une erreur qui me dit que je ne peux pas créer un fils dans un certain thread pour l'utiliser ensuite dans un autre thread.
    Je précise que mon application hérite de QObject.

    De plus la fonction moveToThread() ne résoudrait pas mon problème car je veux que ma socket reste dans mon application afin de la garder d'un thread sur l'autre.

    Si vous avez déjà eu ce problème ou que je fais une erreur de conception merci de m'aider.

    J'espère avoir été clair, si vous avez des question n'hésitez pas, sinon merci d'avoir lu ce message.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut.
    Regarde bien la doc de movetothread, tu devrais trouver ton problème
    Sinon, as tu regardé :
    http://qt.developpez.com/doc/latest/...fortuneserver/

  3. #3
    Membre confirmé Avatar de Tom487
    Homme Profil pro
    Étudiant informatique
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut
    Bonjour, merci de ton aide premièrement!

    Ensuite, je viens de passer une partie de la matinée à regarder le movetothread, plus particulièrement avec ces deux liens :
    http://qt-labs.developpez.com/thread...-movetothread/
    http://qt-labs.developpez.com/thread...ans-maux-tete/

    J'ai testé cette solution : http://qt-labs.developpez.com/thread...ans-maux-tete/

    Malheureusement mon problème n'est toujours pas résolu, je vais regarder plus en détail ton lien car même si c'est en TCP alors que je fais de l'UDP ça à l'air d'être proche de ce que je fais.

    L'erreur exacte est : "QObject : Cannot create children for a parent that is in a different thread"
    Je me demande si c'était pas tout simplement impossible ce que je veux faire ^^, ce qui m'étonnerais grandement.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par Tom487 Voir le message
    L'erreur exacte est : "QObject : Cannot create children for a parent that is in a different thread"
    Quand tu créé un objet, tu lui passe un parent qui appartien à un autre thread. D'où l'erreur.

    Si tu fait des moveTothread, pourquoi as tu besoin de lui donner un parent?

    Peux tu mettre un peux de code? J'ai un doute, il me semble que cette erreur apparaît quand on fait un moveTothread sur une socket Qt. Du coup, regarde l'exemple qui montre l'utilisation des socket en multithread. Ca devrais correspondre à ton cas. En gros, tu utilise l'id de la socket au lieu de transferer une socket Qt.

    http://qt.developpez.com/doc/latest/...cketdescriptor
    http://qt.developpez.com/doc/latest/...cketdescriptor

  5. #5
    Membre confirmé Avatar de Tom487
    Homme Profil pro
    Étudiant informatique
    Inscrit en
    Avril 2011
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 111
    Par défaut
    En faite, ce que je voulais faire au début, c'est créer un thread en lui passant mon client en paramètre afin que ce thread puisse utiliser la QUdpSOcket.

    Pour les movetothread, je n'en ai dans mon code que depuis ce matin, je ne comprend pas encore bien l'utilité, pour l'instant j'essaye juste de trouver le méthode qui marche pour ensuite mieux la comprendre.

    Comme il l'a expliqué dans le tuto, je ne fais pas de movetothread sur la socket mais sur le thread, comme ç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
     
    //Soit je fais comme ça, soit je ne passe rien en paramètre et j'utilise le setClient() afin
    // que mon thread connaisse le client et utilise la socket du client.
        threadClient = new ThreadSend(this->getC()); // getC est la socket UDP
     
        threadClient->moveToThread(&thread);
     
        threadClient->setClient(this);
        threadClient->setFrame(frame);
     
        threadClient->connect(&thread, SIGNAL(started()), threadClient , SLOT(send()));
     
        thread.connect(threadClient, SIGNAL(finished()), &thread ,SLOT(quit()));
     
        // If thread cannot send data or connect with server
        connect(threadClient, SIGNAL(fail(QString)), tb_chat, SLOT(append(QString)));
     
        thread.start();
    Pour tn idée sur le fait d'utiliser l'id au lieu de la socket, je sais pas, normalement vu que j'utilise le pointeur de socket de mon client ça devrais marcher na ?
    SI t'as besoin de plus de code ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par Tom487 Voir le message
    En faite, ce que je voulais faire au début, c'est créer un thread en lui passant mon client en paramètre afin que ce thread puisse utiliser la QUdpSOcket.
    J'ai bien compris. C'est object sont une interface à une socket système qui exploite l'eventloop pour son fonctionnement.

    Pour les movetothread, je n'en ai dans mon code que depuis ce matin, je ne comprend pas encore bien l'utilité
    A associe le fonctionnement d'un QObject à une autre eventloop.

    Comme il l'a expliqué dans le tuto, je ne fais pas de movetothread sur la socket mais sur le thread, comme ça :
    Pourquoi sur le thread??



    Pour tn idée sur le fait d'utiliser l'id au lieu de la socket, je sais pas, normalement vu que j'utilise le pointeur de socket de mon client ça devrais marcher na ?
    C'est ce que montre l'exemple de Qt. Après, je ne sais plus s'il y as un problème à changer de thread un QxxxSocket. Mais vue ce que j'ai compris, il faut mieux utiliser cela.

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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