[QT3] Methode bloquante reception QSocket

Methode bloquante reception QSocket [QT3] - C++ - Programmation

Marsh Posté le 04-04-2006 à 20:02:59    

Bonjour,
J'aimerais un petit peu d'aide car je galere un petit peu.
DAns le cadre d'un projet je dois faire un client serveur en C++
J'utilise pour ca les classe QT (Après avoir utilisé les methode C standart style accept,bind,listen,sento,recvto ,etc....)
Mon serveur fonctionne bien  
Mais le client à un problemme enfin non c'est moi qui est problemme pour le codé lol  
Je cherche a faire en sorte que le client se bloque comme pour les methode en C quand je dois recevoir  
une informations du reseaux.
Actuelement je n'ai trouvé aucune methode dans QSocket (peu etre mal chercher) qui réussise à blocké l'appli tant que
rien n'est à lire j'ai juste réussi a faire fonctionné l'exemple de QT Assistant et le modifié un peu pour qu"il intégre mais methode  
spécifique.
 
Si qqn à une idée pour mon problemme je suis prenneur Merci !!  
 :jap:  :jap:


Message édité par ducseb le 04-04-2006 à 20:03:41
Reply

Marsh Posté le 04-04-2006 à 20:02:59   

Reply

Marsh Posté le 04-04-2006 à 20:41:15    

Il y a un exemple de client-serveur fourni avec Qt.
Tu pourrait lire la doc:
Q_ULONG waitForMore ( int msecs, bool * timeout ) const

Reply

Marsh Posté le 04-04-2006 à 20:50:22    

Désolé j'ai vu cette methode juste après avoir posté  :ange:  :ange:  
mais super merci a toi nargy je vais de suite testé si ca marche bien

Reply

Marsh Posté le 04-04-2006 à 23:30:49    

A tout hasard, cette méthode ne bloquerait-elle pas aussi les événements systèmes comme les repaint etc... ?
 
Si c'est le cas, tu pourrais faire chronologiquement:
1. le client émet une requête vers ton serveur
2. Tu bloques les input events (l'appli répondra ainsi toujours présent au système)
3. Tu te bases sur l'émission du signal readyRead() pour lire tes données
4. Tant que les données reçues ne contiennent pas la balise de fin ou la quantité de donnée attendue (selon le shéma que tu comptes utiliser), tu continue de lire, et les input events sont toujours bloquées (BTW, pense à un sablier ou à une progress bar configurée en "busy indicator"
5. Tu as lu tout ce que tu attendais, tu réactives les user inputs

Reply

Marsh Posté le 04-04-2006 à 23:49:54    

> A tout hasard, cette méthode ne bloquerait-elle pas aussi les événements systèmes comme les repaint etc... ?
- A tout hasard, non, c est sûr! elle est même explicitement déconseillée dans la doc de Qt.

Reply

Marsh Posté le 04-04-2006 à 23:52:46    

Bah ouais, mais comme je l'ai jamais testée (vu qu'elle est déconseillée :D ) et que tu lui conseillais, je voulais juste être sûr ;)

Reply

Marsh Posté le 04-04-2006 à 23:59:02    

perso, je lui conseillerai pas non plus, mais bon j avais pas envie que ce topic se transforme en discussion sur l utilisation des sockets bloquantes ou non...

Reply

Marsh Posté le 05-04-2006 à 00:13:59    

C'est clair que ce n'est pas un solution pratique mais pour les slot je galere un peu vu que je suis pas trop habitué à QT en fait !
Sinon j'ai testé avec le waitForMore mais ca ne marche pas top voila le code que j'ai ecrit :
 

Code :
  1. bool ClientSocketQT::emission(QString info)
  2. {
  3. std::cout<<"Debut envoi\n";
  4. QTextStream os(this);
  5.         os <<info<<endl;
  6. std::cout<<"Envoi OK\n";
  7. this->waitForMore(3000);
  8. std::cout<<"Recupération des données\n";
  9. std::cout<<"Methode fin attente\n"<<endl;
  10. std::string reponseInitialisation=this->readLine();
  11. std::cout<<"Réponse du serveur:"<<reponseInitialisation<<"\n";
  12. return true;
  13. }


 
Mais ca ne marche meme pas ca fait le wait de 3sec (le serveur mais moins de temps à repondre normalement,moins de 0.5s)  puis après il ne receptionne rien sur le readline.

Reply

Marsh Posté le 05-04-2006 à 00:31:02    

c'est:
waitForMore(-1)
 [:chatigret] tu devrai peut être potasser un poil la doc Qt ;)

Reply

Marsh Posté le 05-04-2006 à 00:32:29    

Code :
  1. QTextStream os(this);
  2.        os <<info<<endl;


heu...là tu envoie tes infos dans le vent!

Reply

Marsh Posté le 05-04-2006 à 00:32:29   

Reply

Marsh Posté le 05-04-2006 à 07:27:38    

NOn ca marche ca, le serveur recoi bien les informations (this il est de type QSocket)
 
Sinon pour le waitFoMore(-1) au debut je mettais ca mais le programme reste en attente car il n'arrive pas à envoyé  
Il passe :
QTextStream os(this);
os <<info<<endl;
qui normalement est censé envoyé les infos sur le serveur sauf que ca n'envoi pas le serveur receptionne les infos uniquement après le waitForMore()

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed