Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
616 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Timeout sur la lecture d'un pipe ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Timeout sur la lecture d'un pipe ?

n°918082
Bobarctor
Posté le 08-12-2004 à 16:33:57  profilanswer
 

Bonjour,
 
je souhaiterais mettre un timeout sur la lecture d'un pipe cree avec CreatePipe et lu avec ReadFile: j'aimerais qu'au bout d'un certain temps pendant lequel plus aucune donnee ne transit par le pipe, que le pipe soit ferme.
 
Comment est ce possible ? Je voulais faire ca avec un select timeouté, mais pas moyen, mon select retourne systematiquement -1 (faut dire que sous windows les fd sont des void *).
 
en me relisant je me rend compte que c'est purement oriente windows parce que ca devrait marcher avec unix :(
 
Merci de votre aide


Message édité par Bobarctor le 08-12-2004 à 16:37:27
mood
Publicité
Posté le 08-12-2004 à 16:33:57  profilanswer
 

n°918153
HelloWorld
Salut tout le monde!
Posté le 08-12-2004 à 17:38:22  profilanswer
 

Utilise WaitForSingleObject.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°918388
Bobarctor
Posté le 08-12-2004 à 22:31:27  profilanswer
 

Oui je connais WaitForSingleObject mais ça n'introduit pas dans mon cas la notion de "tu fermes le pipe si tu reçois plus de données depuis x secondes" ou alors en tout cas je ne vois pas comment l'implémenter :)

n°918642
HelloWorld
Salut tout le monde!
Posté le 09-12-2004 à 10:54:46  profilanswer
 

Ben tu mets un timeout sur WaitForSingleObject.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°918708
Bobarctor
Posté le 09-12-2004 à 12:30:44  profilanswer
 

Oui mais non. Si je lis bien le man, peut importe ce qui se passe (donnees encore envoyees ou pas), le pipe sera ferme, point.

n°918749
HelloWorld
Salut tout le monde!
Posté le 09-12-2004 à 13:41:00  profilanswer
 

Mais je pige pas. Je croyais que c'est toi qui voulait fermer le pipe s'il tu ne recevais rien => si WaitForSingleObject te renvoie WAIT_TIMEOUT ben CloseHandle et voilà.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°918790
Bobarctor
Posté le 09-12-2004 à 14:22:58  profilanswer
 

HelloWorld a écrit :

Mais je pige pas. Je croyais que c'est toi qui voulait fermer le pipe s'il tu ne recevais rien => si WaitForSingleObject te renvoie WAIT_TIMEOUT ben CloseHandle et voilà.


 
Oui globalement c'est ca :) en fait je ne sais pas comment l'implementer dans ma boucle de lecture sur le pipe.
 

Code :
  1. while (1)
  2. {
  3.  if(!ReadFile(StdoutRdDup, chBuf, 1024, &dwRead, NULL) || dwread == 0)
  4.   break;
  5. }


 
un select aurait ete super dans ce cas la d'autant que je vois bien comment l'implementer mais apparemment c'est impossible sous windows car HANDLE != fd de select.
Au passage je suis etonne du comportement de ReadFile que je croyais non bloquant.
 
Je precise qu'ici StdoutRdDup est la sortie de mon pipe.
 
Donc pour le WaitForSingle object pourquoi pas, mais je ne sais pas ou le mettre.

n°918797
HelloWorld
Salut tout le monde!
Posté le 09-12-2004 à 14:27:44  profilanswer
 

WaitForSingleObject s'utilise à la place de select. C'est le même but. Par contre je sais pas si ça marche sur un pipe basique, je crois que j'avais eu des pblm là dessus. Faut utiliser un pipe asynchrone avec les IOCP.
Test quand même (tu remplaces ton readfile par WaitForSingleObject c'est tout, et si c'est WAIT_OBJECT_0 alors hop ReadFile).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°918820
Bobarctor
Posté le 09-12-2004 à 14:53:58  profilanswer
 

HelloWorld a écrit :

WaitForSingleObject s'utilise à la place de select. C'est le même but. Par contre je sais pas si ça marche sur un pipe basique, je crois que j'avais eu des pblm là dessus. Faut utiliser un pipe asynchrone avec les IOCP.
Test quand même (tu remplaces ton readfile par WaitForSingleObject c'est tout, et si c'est WAIT_OBJECT_0 alors hop ReadFile).


 
Non ca marche pas:
 
J'utilise un pipe non nomme cree avec CreatePipe tout simple :-/
Par contre je sais pas si ma methode de test est bonne:
le pipe est sur la sortie d'un processus qui execute un programme qui fait en gros un cout << "toto"; sleep(15); cout << toto;
 
je devrais normalement recevoir qu'un toto puis que ca parte en timeout mais la j'ai les deux et wait ne s'affiche jamais.
 

Code :
  1. while (1)
  2. {
  3.  if (WaitForSingleObject(StdoutRdDup, 1000) == WAIT_OBJECT_0)
  4.  {
  5.  if(!ReadFile(StdoutRdDup, chBuf, 1024, &dwRead, NULL) || dwRead == 0)
  6.   break;
  7.  }
  8.  else
  9.   cout << "wait" << endl;
  10. }

n°918839
HelloWorld
Salut tout le monde!
Posté le 09-12-2004 à 15:07:15  profilanswer
 

Pourquoi tu veux fermer le pipe au bout d'un certains temps ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 09-12-2004 à 15:07:15  profilanswer
 

n°918936
Bobarctor
Posté le 09-12-2004 à 16:20:58  profilanswer
 

non pas au bout d'un certain temps, je veux le fermer quand il n'y a plus de donnees qui y passe depuis un certain temps et si c'est le cas, je kill le process.

n°918946
HelloWorld
Salut tout le monde!
Posté le 09-12-2004 à 16:35:52  profilanswer
 

Ben regarde voir la lecture asynchrone avec ReadFile (dernier argument).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Timeout sur la lecture d'un pipe ?

 

Sujets relatifs
select et socket enrobé de sucre (fdopen mode lecture) -> probleme ???Bleuffer le timeout d'internet explorer
ouvrir un fichier excel en lecture/écritureproblème lecture d'une valeur avec le caractere slach
Problème de lecture hibernate.cfg.xml à cause dtdProb de timeout
[JAVA] Lecture de fichierSimple lecture au clavier sous windows : ma console ne me demande rien
JBoss et MySql : Pb de timeout[ASPX][C#] Lecture d'une HtmlTable
Plus de sujets relatifs à : Timeout sur la lecture d'un pipe ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR