Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2013-05-24 11:14:14 Comment "threader" une connexion TCP ?

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Comment "threader" une connexion TCP ?



Bonjour,

Mon projet avance. L'interface est prête mais il me reste un problème majeur à résoudre : le blocage de l'application quand l'appli tente de se connecter à une adresse IP non dispo.

J'aimerais donc bien mettre cet appel dans un thread dédié. Seulement, si je vois comment ça fonctionne à peu près, j'ai du mal à évaluer comment le mettre en place dans mon cas car je dois passer des arguments au thread et récupérer des infos une fois le thread terminé.

Dans ma classe, j'ai les valeurs utiles suivantes :
- bool connected // on est connecté ou non
- string ip_add // adresse IP de la machine à atteindre
- int port // port de connexion du serveur
- string rep // réponse du serveur
- string command // commande envoyée au serveur

Mon synoptique est le suivant :

- si non connecté, on tente une connexion sur ip_addr:port
- si connected = false, on affiche "erreur de connexion"
- sinon on affiche "connecté à ip_addr:port"
- on envoie la commande command
- on lit la réponse rep du serveur
- on ferme la connexion
- on retourne la réponse rep

j'ai essayé de mettre la tentative de connexion en thread mais :
1) je n'y arrive pas wink
2) je pense que cela ne suffira pas. Il faut je pense mettre TOUT ce qui concerne les communications réseau en thread ?!

je peux publier l'intégralité du code si vous avez besoin, ce serait super si quelqu'un pouvait me débloquer la situation...

merci...

Hors ligne

 

#2 2013-05-26 02:01:14 Re : Comment "threader" une connexion TCP ?

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: Comment "threader" une connexion TCP ?



hello,

je remonte ce topic parceque bon... je m'en sors toujours pas !
je suis sur que des kadors circulent par ici wink

merci à vous

Hors ligne

 

#3 2013-09-08 08:33:14 Re : Comment "threader" une connexion TCP ?

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: Comment "threader" une connexion TCP ?



salut, je viens de faire face a ce même problême, mon app android frizait quand le serveru était indisponible.
Je sais que ce post date de quelque mois, mais ça fera toujours une référence supplémentaire :

/*
 * ofTcpClientThread.h
 *
 *  Created on: 7 sept. 2013
 *      Author: gilles
 */

#ifndef OFTCPCLIENTTHREAD_H_
#define OFTCPCLIENTTHREAD_H_

#include "ofMain.h"
#include "ofxNetwork.h"
// my thread for the tcp client, sure it can be better, but I'm a padawan
class ofTcpClientThread: public ofThread {

	void threadedFunction() {
		// while(isThreadRunning()) does the thread loop, without that, it work once...
		while (isThreadRunning()) {
// check if my client is connected
			if (myClientTcp.isConnected()) {
// lock the ressource
				lock();
				// let know the main thread we are online
				isConnected = true;
// check if the main thread already read the received data, without that
				// without that the main thread is unable to get the data, strange...
				if (isChecked) {
					rawReceived = myClientTcp.receive();

					isChecked = false;
				}
				// unock the ressource
				unlock();
			} else {
// if client is unconnected

				myClientTcp.setup(ip, 11211);
				// how the message are ended, you must define it.
				myClientTcp.setMessageDelimiter("}");
				// lock the ressource
				lock();
				// let know is unconnected
				isConnected = false;
				// unlock the ressource
				unlock();
			}

		}
	}
	ofxTCPClient myClientTcp;
	// i must define this variables as public, without that i got an error 
	// if i try to access them since the main thread, i got an error about private access
public:
	string rawReceived = "";
public:
	bool isConnected = false;
public:
	bool isChecked = true;
	string ip = "192.168.0.42";
};

#endif /* OFTCPCLIENTTHREAD_H_ */

Donc dans mon code, j'accède depuis le main thread au donné tel que rawReceived, et isConnected, et le main thread lui renvoie le ischecked.
Pour ça je crèe mon trhead par exemple :
Dans le setup :

ofTcpClientThread monThread;
monThread.startThread(true, false);

et dans la partie update je bloque les ressources de mon trhead , puis j'accède a celle ci;

monThread.lock();
isConnected=monThread.isConnected;
datareceived=monThread.rawReceived;
monThread.isChecked=isChecked;
monThread.unlock();

Les fonctions lock et unlock permettent dans le thread et dans le main trhead de bloquer l'accès au ressources, et ainsi les modifier wink

Dernière modification par cgiles (2013-09-08 08:39:58)

Hors ligne

 

#4 2013-09-08 18:35:37 Re : Comment "threader" une connexion TCP ?

caracteriel
membre
Date d'inscription: 2011-07-03
Messages: 130

Re: Comment "threader" une connexion TCP ?



Regarder ofHttpRequest et ofHttpResponse, qui peut simplifier la tâche

Hors ligne

 

#5 2013-09-12 16:45:12 Re : Comment "threader" une connexion TCP ?

cgiles
membre
Lieu: Est de la France
Date d'inscription: 2005-05-25
Messages: 329

Re: Comment "threader" une connexion TCP ?



Je me connecte a un serveur tcp, et non pas un serveur http, ça peut me servir quand même ?

Hors ligne

 

#6 2013-10-01 23:53:13 Re : Comment "threader" une connexion TCP ?

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: Comment "threader" une connexion TCP ?



Salut,

Merci pour cette explication qui pourra effectivement (me) servir à l'occasion !

Je dis que ça pourra me servir dans de futurs projets car finalement pour celui ci j'ai fini par tout re-coder en Qt ou les connexions TCP sont bien mieux gérées et l'interface graphique plus simplement réalisable.

D'ailleurs j'aimerais bien voir un jour débarquer openFrameworks dans le monde Qt, mais c'est un autre débat !

Hors ligne

 

#7 2013-10-02 15:15:56 Re : Comment "threader" une connexion TCP ?

nononononono
membre
Lieu: Toulouse
Date d'inscription: 2011-02-04
Messages: 614

Re: Comment "threader" une connexion TCP ?

Hors ligne

 

#8 2013-10-02 15:31:25 Re : Comment "threader" une connexion TCP ?

Marty
membre
Date d'inscription: 2012-04-27
Messages: 143

Re: Comment "threader" une connexion TCP ?



Oui je suis déja tombé sur ce document, c'est un très bon début mais l'idée (la mienne en tout cas) serait que oF soit intégrable dans l'IDE de Qt (Qt Creator) pour tirer le potentiel multiplateforme du framework.

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024