-
Timer sur une tâche en C
Bonjour,
Je souhaite réaliser un script qui permet de faire la tache pendant x secondes. en fait, la tache bloque des fois et je veux l'arrêter après un certain temps et sortir avec un message d'erreur.
J'ai cherché sur google des solutions, mais toutes ne marchent pas quand la tache bloque ou passe trop de temps à s'exécuter.
Merci
-
Ça dépend essentiellement du système d'exploitation que tu utilises et du langage dans lequel tu écris ton programme. Si c'est en C, le plus simple aujourd'hui consiste à lancer un thread indépendant du fil qui doit exécuter ta tâche, lui faire faire un sleep(n) et tuer l'autre thread à la fin de cette durée si l'autre ne l'a pas fait avant.
Si tu veux éviter les threads, sous Unix, tu peux également utiliser alarm() pour que le système t'envoie un signal après une temporisation donnée.
Le plus propre, en revanche, consiste à se pencher sur la tâche en question : il y a de fortes chances pour qu'elle soit, d'une manière ou d'une autre, dotée d'un système de timeout qui lui permette de se terminer d'elle-même à l'échéance.
-
Merci pour la réponse. Je suis sous Windows.
La tache en question contient des fois une boucle infinie, c'est pour ça que je veux l'arrêter après un certain temps.
Je vais me pencher sur les threads
-
Si c'est un boucle infinie que tu as écrite toi, alors il faut modifier la boucle, et pas lancer pas un thread extérieur.
Utilise time(), par exemple, pour connaître la date avant l'entrée dans ta boucle. Ajoute-lui la durée de vie que tu veux lui accorder et rappelle time() dans ta boucle. Tu sors dès que la valeur renvoyée dépasse celle que tu as calculée au départ.
-
La terminaison asynchrone des threads est quelque chose boure de problemes conceptuels importants, au point que ca n'a pas ete normalise en C++11 et en C11 meme si les OS proposent generalement quelque chose (mais bien voir quoi, si j'ai bonne memoire, une boucle de calcul pur n'est pas terminable comme ca avec Posix, il faut arriver a un point de terminaison et ceux-ci sont en gros les appels systemes).
Ce qu'on fait habituellement, c'est tester periodiquement une variable atomique disant que la thread doit s'arreter..