timer qui inteerompt script principal

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
daniel45
Messages : 9
Enregistré le : lun. 1 janv. 2018 21:54

timer qui inteerompt script principal

Message par daniel45 » sam. 6 janv. 2018 13:52

Bonjour a tous,

J'ai a realiser un timer en tache de fond qui decompte une heure et interrompt mon script en cours.

Il semblerai que cela s'execute avec des Threads mais j'avoue que mes connaissances sur python sont pour l'instant limités et je ne vois pas comment prendre le probleme. Je n'ai pas trouvé sur le net un script simple qui repond a se besoin d'ou ma demande.
L'objectif est au lancement de mon script initial je lance aussi cette tache de fond et qu'au bout d'une heure j'interrompt mon script prinicipal.
Voila merci d'avance pour aide
PS : j'utilse un PI 3 sous python 3

Avatar du membre
EVOTk
Modérateur
Messages : 797
Enregistré le : sam. 20 sept. 2014 02:36

Re: timer qui inteerompt script principal

Message par EVOTk » sam. 6 janv. 2018 16:14

Salut,
C'est quelque chose que je ne sait pas faire mais par contre, pourquoi ne pas prévoir sa directement dans ton script ?
QUand il se lancer tu mémerise l'heure dans une variable et quand cette heure + 1h ( par exemple ) et sup ou egal a l'heure actuel, il s'arrete.
NAS : DS3615xs Xpenology - 8To + 2x 3To + 2x 4To WD Red - APC Back-UPS Pro 900
Imprimante 3D : Dagoma DiscoEasy 200
Surveillance Réseau : Smokeping sur Rasp. B / Raspbian
Arcade : Raspberry Pi 3 sous RecalBox

Bud Spencer
Raspinaute
Messages : 388
Enregistré le : lun. 15 août 2016 21:38

Re: timer qui inteerompt script principal

Message par Bud Spencer » dim. 7 janv. 2018 15:14

De 2 chose l’une. Soit tu veux écrire un programme qui va en arrêter un autre dans 1 heure ou alors tu veux un programme qui s’arrête de lui-même au bout de 1 heure. Ce sont 2 concepts totalement diffèrent.

Dans le premier cas, pas besoin de multithread puisque tu as un programme qui tourne et un second qui n’a qu’à se contenter d’envoyer un signal au process du premier dans 1 heure (voir lib signal en python et documentation sur les signaux UNIX). Rien de bien compliqué si ce n’est qu’il faut récupérer l’id du process a arrêter et prévoir la réception de ce signal dans le programme ‘client’ pour bien fermer proprement les éventuelles connexions et fichiers ouvert et libérer d’éventuelles ressources avant l’arrêt. J’avais déjà écrit un bout de code en python pour ça quelques par sur ce forum, mais je sais plus ou ….

Dans le second cas un seul programme suffit. Tu le lances et il s’arrête de lui-même dans 1 heure. La effectivement il faut faire du multithread. J’entends déjà la horde qui s’insurge en pensant que l’on peut se passer de thread en contrôlant l’heure à chaque tour dans la boucle du thread principale, mais ce n’est parce que les autres font n’importe quoi que tu dois faire pareil (petit rappel sur les threads et leur utilités). Le thread principal du programme fait ce qu’il a à faire et un autre thread qui patiente 1 heure avant d’interrompre le thread principale d’une manière ou d’une autre. C’est la solution la plus simple à mettre en œuvre. Voilà un exemple tout bateau de ce que ça peut donner en python :
thread_endprog_py.png
thread_endprog_py.png (33.36 Kio) Vu 270 fois
thread_endprog_py2.png
thread_endprog_py2.png (26.69 Kio) Vu 270 fois
L’exemple s’arrête au bout de 10 secondes, mais si tu veux 1 heure il suffit de remplacer l’argument 10 par 3600 sur la ligne qui définit le thread t.

Il y a aussi d’autres solutions pour par exemple envoyer un ordre à un programme pour qu’il s’arrête dans x secondes en utilisant une simple ligne de commande mais bon, si tu n’arrives pas à mettre déjà les 2 premières idées en œuvre, ça va vite se compliquer pour toi.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

daniel45
Messages : 9
Enregistré le : lun. 1 janv. 2018 21:54

Re: timer qui inteerompt script principal

Message par daniel45 » ven. 2 févr. 2018 09:33

DEsole pour la reponse si tardive.
EXCELLENT et merci . Dificile quand on debute a 60 ans en pythonde tout integrer en peu de temps.La comprhension des Threads est encore nébuleuse pour l'instant :D .
Merci encore pour le temps passer a ma question et ta reponse aussi claire.

Bud Spencer
Raspinaute
Messages : 388
Enregistré le : lun. 15 août 2016 21:38

Re: timer qui inteerompt script principal

Message par Bud Spencer » sam. 3 févr. 2018 12:36

Utilisé comme ça, la notion de thread est très simpliste. Dis-toi juste que cela permet à ton programme de faire plusieurs choses simultanément.

Par contre attention aux pièges … L’exemple démarre un thread qui attend x secondes. Au terme de ce délai, ce thread passe la variable endprog à false et se termine. A ce stade, le thread principal est donc le seul qui soit encore ‘vivant’. Mais si tu arrêtes volontairement le programme avant ce délais (ctrl+c) cela va forcément générer une erreur et cela n’arrêtera pas le thread waithour. Ton programme ne rendra pas la main avant le terme du delais. Tout comme si tu faisais 2 programmes séparés. En arrêter arbitrairement un ne signifiait pas systématiquement que cela arrêterai le second …

Tout ça pour dire que c’est un exemple qui répond à ta question, mais qui mis en œuvre tel quel pose un gros problème puisqu’il ne prend pas en charge tous les cas d’interaction. Si tu veux faire bien, il faut prévoir de pouvoir interagir avec tes threads secondaires depuis le thread principal de façon à pouvoir leur passer des ordres, notamment celui de s’arrêter.

Garde à l’esprit que la règle n° 1 dans l’usage des threads, c’est que tous les threads secondaires doivent impérativment être terminés avant de terminer le thread principal ;)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

daniel45
Messages : 9
Enregistré le : lun. 1 janv. 2018 21:54

Re: timer qui inteerompt script principal

Message par daniel45 » sam. 3 févr. 2018 18:30

Merci beaucoup ca fonctionne maintenant

Répondre

Retourner vers « Python »