Minuterie personnalisée

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Minuterie personnalisée

Message par omega »

Bonsoir à tous

Je souhaiterais prévoir un code dans mon programme qui permet de calculer le temps d'inactivation du programme avant de se fermer. Exemple si mon programme est inactif (souris+clavier non utilisés depuis un temps T), alors le programme se ferme automatiquement...
merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Minuterie personnalisée

Message par case »

si c'est un programme utilisant une fenetre

Code : Tout sélectionner

OpenWindow(1,0,0,500,500,"timeout test")

timetodie=5000 ; 5 seconds
time=ElapsedMilliseconds(); derniere activité
Repeat
  ev=WaitWindowEvent(timetodie)
  If ev ; si un evenement est declenché
    Debug "reset time"
    time=ElapsedMilliseconds(); derniere activité        
  EndIf
  
  
Until ev=#PB_Event_CloseWindow Or ElapsedMilliseconds()-time>=timetodie ; on sort si on clic sur fermer ou si le temps ecoulé è le temps de la derniere activité >= 5 secondes
Debug " now it's time to die"
ImageImage
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Minuterie personnalisée

Message par omega »

Mon programme contient plusieurs fenêtres. Faudra t-il mettre ça dans chaque fenêtre? Dans ton exemple, la sortie est déclenchée dans le cas où le temps dépasse les 5 secondes dans UNE FENETRE DONNEE, mais il y a aussi les autres fenêtres qui peuvent être actives au même moment....

Comment faire pour le savoir justement? (savoir si toutes les fenêtres sont inactives?)
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Minuterie personnalisée

Message par case »

Code : Tout sélectionner

  If ev ; si un evenement est declenché
    Debug "reset time"
    time=ElapsedMilliseconds(); derniere activité        
  EndIf
  
cette partie du code change la variable time des qu'un evenement est produit sauf si tu gere les evenements de chaque fenetre dans une boucle dediée
qu'importe l'endroit ou l'evenement est declenché.


il y a cependant un souci avec ElapsedMilliseconds() c'est que le temps renvoyé est calculé depuis le dernier redemarage de l'ordinateur et si tu ne redemarre pas l'ordinateur souvent cela peux rendre la commande imprécise/inutilisable.

du coup un code utilisant plutot la date() du systeme qui indique le nombre de secondes depuis '01/01/1970 0:00:00'
une precision max d'une seconde mais je suppose que pour ce type de besoin c'est largement sufisant

Code : Tout sélectionner

OpenWindow(1,0,0,500,500,"timeout test")
timetodie=5 ; 5 seconds
time=Date()
Repeat  
  ev=WaitWindowEvent(timetodie*1000) ; attend un evenement au maximum le temps defini en secondes
  If ev ; si un evenement est declenché
    Debug "une action a ete effectuée"  
    time=Date()
   EndIf
Until ev=#PB_Event_CloseWindow Or Date()-time>=timetodie ; on sort si on clic sur fermer ou si le temps ecoulé è le temps de la derniere activité >= 5 secondes
Debug " now its time  to die"
end
ImageImage
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Minuterie personnalisée

Message par Ollivier »

case a écrit :il y a cependant un souci avec ElapsedMilliseconds() c'est que le temps renvoyé est calculé depuis le dernier redemarage de l'ordinateur et si tu ne redemarre pas l'ordinateur souvent cela peux rendre la commande imprécise/inutilisable.
Les deux fonctionnent pour ça (Date() et ElapsedMilliseconds() ).

ElapsedMilliseconds() retourne un quad signé. Ça fait 8 milliards de milliards de millisecondes possibles. Donc ElapsedMilliseconds() va buguer si on laisse en route l'ordinateur pendant 300 millions d'années...
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Minuterie personnalisée

Message par case »

:mrgreen:
je pense que mon souci viens du fait que je n'avais pas utilise un quad pour stocker la valeur retournée
du coup c'est moins long :)
ImageImage
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Minuterie personnalisée

Message par Ollivier »

Ah oui, si on stocke dans une variable de type Long, ElapsedMilliseconds() bugue au bout de 24 jours seulement, tandis que Date() résiste 72 ans.
(Hors-Sujet) a écrit :C'est un peu ce qui me fait flipper avec le JavaScript : ils ont des entiers complètement tordus de 48 bits, et des flottants efficaces ("significatifs") sur 52 bits. Ça semble pas repérable, comparé aux variables 32/64 bits...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Minuterie personnalisée

Message par Ollivier »

@case

Mea culpa, ElapsedMilliseconds() semble buguer aussi sur du type quad pour une mesure de temps dépassant plusieurs semaines donc ton conseil d'utiliser la fonction Date() est... inébranlable.
Répondre