Timeout sur la lecture d'un pipe ? - C++ - Programmation
Marsh Posté le 08-12-2004 à 17:38:22
ReplyMarsh 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
Marsh Posté le 09-12-2004 à 10:54:46
ReplyMarsh 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.
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à.
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 :
|
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.
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).
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. |
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 :
|
Marsh Posté le 09-12-2004 à 15:07:15
Pourquoi tu veux fermer le pipe au bout d'un certains temps ?
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.
Marsh Posté le 09-12-2004 à 16:35:52
Ben regarde voir la lecture asynchrone avec ReadFile (dernier argument).
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