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 :

Plantage après deux entrées dans requestFinished()


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut Plantage après deux entrées dans requestFinished()
    Bonjour tout le monde,
    J'ai développé une application qui se connecte à un serveur distant, envoi un service web et récupère les données.
    Pour se connecter au serveur et invoquer le service Web j'ai utilisé
    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
     
    void Connexion::connectToWebService(QString host, quint16 port, QString path, vector <QStringList> paramsList)
    {	
    	// formater la chaine à envoyer
    	QString params;
    	int i = 0;
    	int listParamSize = paramsList.size()-1;
    	while(i <= listParamSize){
    		if(0 < i){
    			params += "&";
    		}
    		params += QString(paramsList[i].at(0).toLocal8Bit().constData())+"="+QUrl::toPercentEncoding(QString(paramsList[i].at(1).toLocal8Bit().constData()));
    		++i;
    	}
     
    	//invoquer le service web
    	this->http.clearPendingRequests();
     
    	QHttpRequestHeader header("POST", path);
    	header.setValue("HOST", host);
    	header.setValue("Cache-Control", "no-cache");
    	header.setContentType("application/x-www-form-urlencoded");
    	header.setContentLength(params.length());
     
    	this->http.setHost(host);
     
    	this->idVerify = this->http.request(header, params.toUtf8());
     
    	this->http.closeConnection();
    J'ai implémenté la fonction receive qui se déclenche avec le slot requestfinished(int, bool) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(&http, SIGNAL(requestFinished(int, bool)), this, SLOT(receive(int, bool)));
    Le code de la fonction receive est
    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
    void Connexion::receive(int id, bool error)
    {
    	if(error)
    	{
    		qDebug() << http.errorString();
    		this->result = http.errorString();
    	}
    	else
    	{
    		if(id == this->idVerify )
    		{
    			QTextCodec *textCodec = QTextCodec::codecForName("utf-8");
    			QString res = textCodec->toUnicode(this->http.readAll());
     
    			QDomDocument doc;
    			doc.setContent(res);
     
    			QDomElement docElem = doc.documentElement();
    			result = docElem.text();
     
    			// fonction à appeler après reception données
    			startApplication();
    		}
    	}
    }
    Mon problème réside dans le fait que si j'ai une erreur dans le résultat récupéré, la fonction startApplication affiche un message d'erreur. Si j'attends un certain temps, l'application entre de nouveau dans la fonction receive mais cette fois, la variable result est vide et la fonction startApplication affiche un autre message. Si je clique sur ces 2 messages, l'application se plante et j'ai une erreur comme indiqué dans le PJ
    Est ce que quelqu'un a une idée sur ce problème et pourra me venir en aide.
    Merci d'avance.
    Bien cordialement.
    Images attachées Images attachées  

  2. #2
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    pour ceux qui auront le même problème, voici ma solution :
    1. Ne pas fermer la connection http;
    2. récupérer le résultat depuis le serveur web depuis le slot requestFinished quand l'id retourné correspond à l'id de la requête envoyée.
    3. Lancer le traitement souhaité dans la fonction done.

    Si vous voulez bien comprendre le processus de QHttp regardez le slot stateChanged.

    Cordialement.

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

Discussions similaires

  1. Créer une ListBox à deux entrées dans UserForm
    Par Caro974 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/04/2015, 13h45
  2. Réponses: 3
    Dernier message: 11/10/2010, 10h48
  3. un lien d'aprés une entrés dans une table
    Par gastoncs dans le forum Langage
    Réponses: 1
    Dernier message: 21/09/2009, 23h29
  4. [AC-2003] Appel d'une procédure après touche Entrée dans une textbox
    Par Shankara dans le forum IHM
    Réponses: 13
    Dernier message: 31/05/2009, 23h19
  5. Choix entre deux champs dans une requete
    Par Pico10 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/07/2005, 15h36

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