Timeout sur la lecture d'un pipe ?

Timeout sur la lecture d'un pipe ? - C++ - Programmation

Marsh Posté le 08-12-2004 à 16:33:57    

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
Reply

Marsh Posté le 08-12-2004 à 16:33:57   

Reply

Marsh Posté le 08-12-2004 à 17:38:22    

Utilise WaitForSingleObject.


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

Marsh Posté le 08-12-2004 à 22:31:27    

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 :)

Reply

Marsh Posté le 09-12-2004 à 10:54:46    

Ben tu mets un timeout sur WaitForSingleObject.


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

Marsh Posté le 09-12-2004 à 12:30:44    

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.

Reply

Marsh Posté le 09-12-2004 à 13:41:00    

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
Reply

Marsh Posté le 09-12-2004 à 14:22:58    

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.

Reply

Marsh Posté le 09-12-2004 à 14:27:44    

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
Reply

Marsh Posté le 09-12-2004 à 14:53:58    

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. }

Reply

Marsh Posté le 09-12-2004 à 15:07:15    

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


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

Marsh Posté le 09-12-2004 à 15:07:15   

Reply

Marsh Posté le 09-12-2004 à 16:20:58    

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.

Reply

Marsh Posté le 09-12-2004 à 16:35:52    

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


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

Sujets relatifs:

Leave a Replay

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