[cpp] créer un timeout sur une méthode

créer un timeout sur une méthode [cpp] - C++ - Programmation

Marsh Posté le 04-04-2007 à 22:23:31    

Bonjour,
 
J'ai besoins de vos connaissances pour me donner une idée :D
 
J'aimerai pouvoir définir un timeout sur une méthode d'une classe.
 
Je m'explique. Je récupère des données d'un banc de test relié a un PC via une carte d'acquisition. Si un état (d'un capteur) n'est pas détecté au bout d'un certain temps, je veux en conclure que le banc de test n'est pas (correctement ?) branché a cette carte, ou le système mécanique bloqué. Le problème est que, pour vérifier l'état de ce capteur, avec la carte d'acquisition que je dois utilisé, je suis obligé de lire en boucle via un API, une entrée.
 
Pour le moment ce que je fait c'est lire en boucle jusqu'a ce que l'état soit détecté (c'est l'attente d'une fin de course). Et si cet état n'est pas détecté, je reste toujours bloqué dans cette boucle.
 
Au début j'ai pensé incrémenter une variable à chaque lecture, mais c'est pas terrible et pas précis niveau temps. Je voudrais que si la méthode n'a rien retournée (et ne c'est donc pas terminé) avant un certain temps (genre 4 secondes, configurable), que celle-ci soit forcée de s'arrétée (kill).
 
 
Existe-t-il quelque chose de tout fait pour réaliser cela ?
 
Je développe sous Visual C++ 6.0 et l'utilisation des MFC est possible. Je veux éviter de créer un Thread (moi même) pour faire ça.
 
Merci d'avance de votre aide et de vos idées :)

Reply

Marsh Posté le 04-04-2007 à 22:23:31   

Reply

Marsh Posté le 04-04-2007 à 23:16:54    

CreateEvent + WaitForSingleObject

Reply

Marsh Posté le 05-04-2007 à 15:30:04    

et si tu prends le temps (l'heure) au début du traitement,  
et qu'a chaque boucle tu reprends le temps, tu auras le temps écoulé,
tu pourras donc le tester pour sortir de la boucle.

Reply

Marsh Posté le 05-04-2007 à 20:22:31    

J'avais pensé à ça KarLKoX, mais ça m'oblige a recréer encore un thread
 
Très bonne idée ChristianS_ ! je vais essayer comme ça !
 
 
merci a vous deux pour cette aide :)


Message édité par Profil supprimé le 05-04-2007 à 20:22:50
Reply

Marsh Posté le 05-04-2007 à 22:21:24    

en plus de ces 2 solutions
je dirais :
- si tu es dans une application win32 SetTimer()
- sinon timeSetEvent()
 
cf msdn
 

Reply

Marsh Posté le 06-04-2007 à 12:05:56    

joneal a écrit :

en plus de ces 2 solutions
je dirais :
- si tu es dans une application win32 SetTimer()
- sinon timeSetEvent()
 
cf msdn


Mais cela suppose que son programme traite les messages de windows et donc qu'il ne soit pas deja bloqué dans sa boucle pour verifier l'etat du capteur.

Reply

Marsh Posté le 06-04-2007 à 23:39:59    

Le plus simple c'est de faire une boucle qui compte le temps ecoulé et s'arrete si timeout ou lecture de la carte d'acquisition.
Par contre il faut mettre un 'wait' dans la boucle, genre 100 ms, afin de ne pas prendre tout le CPU et de rester interruptible par les events windows.

Reply

Marsh Posté le 07-04-2007 à 10:45:22    


Pour faire ça, c'est pourtant ce qu'il y a de plus recommandé pour un fonctionnement correct de ton application. Je suis prêt à parier que tôt ou tard, tu te verras obligé de passer par des threads, donc autant commencer tout de suite. Ceci dit, l'utilisation des threads nécessite de la rigueur et de laréflexion.


Message édité par el muchacho le 07-04-2007 à 10:46:33
Reply

Marsh Posté le 07-04-2007 à 13:19:44    

Je sais tres bien, mais pour des raisons qui sont propres a mon projet, j'ai une limite en nombre de thread que je dois éviter de dépasser. Ce que je cherche à faire n'est pas quelque chose de très précis, mais c'est vraie que tu as raison.
 
Je vais me baser sur l'idée toute simple de ChristianS_ qui suffira largement pour détecter l'absence de banc de test au bout d'un certain temps (je ne suis pas a une seconde pret...) . Je vais mettre en oeuvre ça cet aprem si j'ai le temps.
 
Marchi et bon week-end de Pâques. :)

Reply

Marsh Posté le 09-04-2007 à 00:06:22    

Ben qui dit timeout dit objet de synchro non ?
Section critique, Mutex, Evenement, Sémaphore... tu n'as que l'embarras du choix. N'oublies pas de mettre le timeout pour le Lock.

Reply

Sujets relatifs:

Leave a Replay

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