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 avec QTcpSocket et QThread


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Par défaut Problème avec QTcpSocket et QThread
    Bonjour lzq ami(e)s, voila j'ai un petit problème avec mon programme Qt, je passe par un thread qui gère le socket de mon programme.
    le soucis st le suivant, via mon thread, je déclare et connecte mon socket dans la fonction run(), tout se passe nikel sauf que celui-ci ne reçois rien.
    hors quand je passe par le thread principal, tout marche a merveille, c'est la que je comprend pas trop >_<.

    j'ai bien essayer la méthode moveToThread(); mais sans résultat aussi.

    voici l bout de code qui se connecte a mon socket
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    _socket->connectToHost("192.168.1.12", 9870);
     
     
    		QByteArray _data;
    		QDataStream packet(& _data, QIODevice::WriteOnly);
     
    		packet << (quint16)CMSG_NEW_GUID_NEEDED;
    		packet << (quint16)0;
    		packet << (quint16)0;
     
    		_socket->sendPacket(_data);
    et voici ma classe qui gère les socket =) :

    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
     
    #include "socket.h"
    #include "Thread.h"
     
    using namespace std;
     
    socket::socket(QString host, uint port, MainThread* t)
    {
    	thread = t;
     
    	//_socket = new QTcpSocket(this);
    	//_socket->moveToThread(thread);
    	connectToHost(host, port);
     
    	connect(this , SIGNAL(readyRead()), this ,  SLOT(receive()));
    	connect(this , SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erreurSocket(QAbstractSocket::SocketError)));
     
    }
     
    socket::socket()
    {
     
    }
     
    void socket::erreurSocket(QAbstractSocket::SocketError erreur)
    {
     
        mLoger error_log;
        std::string str;
     
        switch(erreur) // On affiche un message différent selon l'erreur qu'on nous indique
        {
            case QAbstractSocket::HostNotFoundError:
               str =  "ERREUR : le serveur n'a pas pu être trouvé. Vérifiez l'IP et le port.</em>";
                break;
            case QAbstractSocket::ConnectionRefusedError:
               str = "ERREUR : le serveur a refusé la connexion. Vérifiez si le programme \"serveur\" a bien été lancé. Vérifiez aussi l'IP et le port.";
                break;
            case QAbstractSocket::RemoteHostClosedError:
               str = "ERREUR : le serveur a coupé la connexion.";
                break;
            default:            
               str = "ERREUR : " + errorString().toStdString();
     
    	error_log << QString::fromStdString(str);
    	error_log.write();
        }
    }
     
    void socket::receive()
     
    {
    	QDataStream in(this);
     
    	quint16 opcode;
     
    	in >> opcode;
     
    	if(opcode >= TOTAL_NUM_MSG)
    	{
    		cout << "opcode inconnus : " << getOpcodeName(opcode) << endl;
    		return;
    	}
     
    	_opcodeHandle const& opcodeHandle = opcodeTable[opcode];
     
    	WorldSession* session = new WorldSession(thread);
     
    	(session->*opcodeHandle.handler)(*&in);
     
    }
     
    void socket::sendPacket(QByteArray data)
    {
     
     
    		mLoger error_log;
     
    		error_log << "Erreur " << errorString();
    		error_log.write();
    		write(data);
    }
    merci d'avance de votre aide

  2. #2
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 47
    Par défaut
    enfait, j'ai compris le soucis mais je sais pas comment le résoudre,
    quand je me connecte avec mon socket a partir du thread principal via un fonction que j'ai dans ma classe de thread mon serveur reçois mes packet, hors quand le thread se connecte et essaie d'envoyer un packet, ya rien a faire, le serveur ne reçois rien.

    quelqu'un aurais une solution ^^ ?

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    Concernant les threads:
    - assure toi que ton instance de la classe socket est créé dans son thread, et non pas dans le thread graphique (ou alors il faut effectivement faire un moveToThread).

    - assure toi que le thread de communication est bien démarré (start() est bien appelé ?)

    Après, concernant les sockets:
    - connectToHost() n'est pas bloquant. Donc faire un connectToHost() suvi d'une opération d'écriture a de grande chance d'échouer si la connexion n'a pas eu le temps de se faire.
    Ajoute un waitForConnected(), ou mieux, utilise le signal connected() pour savoir quand la connexion est faite.

Discussions similaires

  1. [QThread] Problème avec QThread
    Par Crabe05 dans le forum Multithreading
    Réponses: 7
    Dernier message: 21/06/2010, 11h54
  2. [QThread] Problème avec QTimer et QThread
    Par scary dans le forum Multithreading
    Réponses: 7
    Dernier message: 15/12/2009, 18h00
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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