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

Réseau Discussion :

Accès exclusif pour le réseau : que choisir ?


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Par défaut Accès exclusif pour le réseau : que choisir ?
    Bonjour, avec Qt la doc propose d'utiliser readDatagram() et writeDatagram() pour recevoir et envoyer des données sur le reseau (en UDP).
    http://qt.developpez.com/doc/latest/qudpsocket.html

    Or readDatagram() est appelé par un signal, et peut donc etre appelé n'importe quand, y compris pendant que je manipule mes données pour writeDatagram()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(udpSocket, SIGNAL(readyRead()),this, SLOT(readPendingDatagrams()));
    Quelle solution élégante et portable me conseillez vous pour faire un accés exlusif, afin que les traitements de reception et d'expédition se fassent l'un après l'autre et pas en même temps ?

    Dsant



    Le code de l'exemple de Trolltech :
    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
    void Server::initSocket()
     {
         udpSocket = new QUdpSocket(this);
         udpSocket->bind(QHostAddress::LocalHost, 7755);
     
         connect(udpSocket, SIGNAL(readyRead()),
                 this, SLOT(readPendingDatagrams()));
     }
     
     void Server::readPendingDatagrams()
     {
         while (udpSocket->hasPendingDatagrams()) {
             QByteArray datagram;
             datagram.resize(udpSocket->pendingDatagramSize());
             QHostAddress sender;
             quint16 senderPort;
     
             udpSocket->readDatagram(datagram.data(), datagram.size(),
                                     &sender, &senderPort);
     
             processTheDatagram(datagram);
         }
     }

  2. #2
    Inactif  


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

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour dsant

    L'exemple donné dans la doc présente uniquement la lecture de données.
    La différence entre la lecture et l'écriture de données, c'est que la lecture dépend d'un signal (le socket qui dit "j'ai des données à transmettre") alors que l'écriture non : tu peux écrire quand tu veux.
    Donc, pour gérer ton accès exclusif :
    * tu peux utiliser des tampons de données différents pour la lecture et l'écriture.
    * tu peux utiliser une classe "intelligente" qui autorisera ou non l'écriture/lecture des données (par exemple QBuffer pour lire/écrire dans un QByteArray : avant de lire/écrire, tu testes si le buffer est déjà ouvert avec la fonction isOpen(). si c'est la cas, tu attends, sinon tu ouvre le buffer en ReadOnly ou WriteOnly puis tu écris/lis)
    * plus compliqué (et risqué) : si tes données sont de tailles importantes et que tu ne veux pas dupliquer (problème de taille) ou attendre en cas de signal readyRead (problème de perte de données), c'est d'écrire une classe permettant l'accès concurrent aux données, en garantissant que l'écriture et la lecture ne provoquent pas de ré-allocation mémoire et qu'ils n'accèdent pas aux mêmes blocs de données.

  3. #3
    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 dsant Voir le message
    Or readDatagram() est appelé par un signal, et peut donc etre appelé n'importe quand, y compris pendant que je manipule mes données pour writeDatagram()
    Tu manipule ta socket par plusieurs thread??

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Je ne comprends pas trop ta question. Tes actions, le socket n'est utilisé que par un thread, ne se feront jamais en même temps.

    Si tu veux juste désactiver la lecture automatique, tu n'as qu'à pas faire le "connect", et appeler toi même la fonction readPendingDatagrams().

    G.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Par défaut
    Merci beaucoup

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

Discussions similaires

  1. Que choisir pour déveloper en C++ : wxWidget, Qt, GTK... ?
    Par Spack dans le forum Bibliothèques
    Réponses: 13
    Dernier message: 17/12/2006, 10h06
  2. Que faut il ajouter pour un Réseau WiFi pour 2 PC
    Par zakuli dans le forum Hardware
    Réponses: 7
    Dernier message: 18/12/2005, 10h43
  3. [Livres]Que choisir pour débuter
    Par newyou dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 28/10/2005, 17h11
  4. Que choisir pour faire un Client/Serveur
    Par Crayon dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/04/2005, 17h43
  5. Librairies graphiques que choisir pour la portabilité ?
    Par SamRay1024 dans le forum OpenGL
    Réponses: 8
    Dernier message: 03/02/2005, 17h22

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