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
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
hello,
je remonte ce topic parceque bon... je m'en sors toujours pas !
je suis sur que des kadors circulent par ici
merci à vous
Hors ligne
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
Dernière modification par cgiles (2013-09-08 08:39:58)
Hors ligne
Regarder ofHttpRequest et ofHttpResponse, qui peut simplifier la tâche
Hors ligne
Je me connecte a un serveur tcp, et non pas un serveur http, ça peut me servir quand même ?
Hors ligne
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
Hors ligne
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
Pages: 1