Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FAIRE UNE PAUSE DANS UN PROGRAMME (PREND EN CHARGE LE PASSAGE DE MINUIT)


Information sur la source

Catégorie :Divers Niveau : Débutant Date de création : 22/12/2002 Date de mise à jour : 12/01/2003 23:38:22 Vu : 6 977

Note :
7,8 / 10 - par 5 personnes
7,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

J'avais besoin de faire une pause dans un de mes programmes.

J'ai donc utilisé la fonction TIMER.
Dans l'aide de MSDN, l'exemple donné n'est pas satisfaisante car elle ne prend pas en charge le passe de minuit.
Il ne faut pas oublier que cette fonction représentant le nombre de secondes écoulées depuis minuit. L'exemple  MSDN
PauseTime = 20   ' Durée de la pause.
Start = Timer   ' Récuperation de l'heure de début de la pause en secondes.
    Do While Timer < Start + PauseTime
        DoEvents 'Donne le contrôle à d'autres processus
    Loop
Cette exemple n'est pas valable car si il est 23h59min50secondes soit 86390 votre programme restera dans un boucle infini vu qu'a minuit votre Timer passera de 86399 à 0

J'ai donc modifier ce code pour prendre en charge le passage de minuit :
 

Source

  • Private PauseTime as Integer
  • Private Start as Long
  • 'A mettre dans une procédure
  • PauseTime = 2 ' Durée de la pause.
  • Start = Timer ' Récuperation de l'heure de début de la pause en secondes.
  • If (Start + PauseTime) < 86400 Then 'Test pour éviter le depassement de 60s*60min*24hrs, c'est à dire 86400 secondes, 1 jour
  • Do While Timer < Start + PauseTime
  • DoEvents 'Donne le contrôle à d'autres processus
  • Loop
  • Else 'Transition entre aujourd'hui et demain
  • 'Cette boucle permet d'attendre que le timer se positionne à 0 soit 00 hrs 00 min 00 secondes
  • Do While Timer > 1 'Mise en attente pour arriver à minuit
  • DoEvents
  • Loop
  • 'Le Timer est donc maintenant à 0
  • '(PauseTime - (86400 - Start)) permet de réinitialiser le temps restant à la pause par rapport au temps déja écoulé
  • Do While Timer < (PauseTime - (86400 - Start))
  • DoEvents
  • Loop
  • End If
Private PauseTime as Integer
Private Start as Long

'A mettre dans une procédure
PauseTime = 2   ' Durée de la pause.
Start = Timer   ' Récuperation de l'heure de début de la pause en secondes.
If (Start + PauseTime) < 86400 Then 'Test pour éviter le depassement de 60s*60min*24hrs, c'est à dire 86400 secondes, 1 jour
    Do While Timer < Start + PauseTime
        DoEvents 'Donne le contrôle à d'autres processus
    Loop
Else 'Transition entre aujourd'hui et demain
    'Cette boucle permet d'attendre que le timer se positionne à 0 soit 00 hrs 00 min 00 secondes
    Do While Timer > 1 'Mise en attente pour arriver à minuit
        DoEvents
    Loop
    'Le Timer est donc maintenant à 0
    '(PauseTime - (86400 - Start)) permet de réinitialiser le temps restant à la pause par rapport au temps déja écoulé
    Do While Timer < (PauseTime - (86400 - Start))
        DoEvents
    Loop
End If 

Conclusion

Je sais, il existe l'API Sleep.
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Après on met ou on veut faire la pause : Sleep 20000 ' Durée de la pause en millisecondes.
Le probleme c'est qu'elle garde la main pendant la durée de la pause et donc si votre application affiche l'heure, celle-ci restera figé durant le temps de la pause se qui n'est pas agréable.

Bonne prog à tous

 

Commentaires et avis

signaler à un administrateur
Commentaire de DeAtHCrAsH le 22/12/2002 18:34:15

Salut...
Voici quelques remarques :

1) L'API sleep n'est pas une réelle pose puisque qu'elle bloque l'execution du programme.

2) Pour faire une pose tu peux faire plus simplement.. Regarde .. Et pas besoin de module ....

tu declares en générale cet API :
Private Declare Function GetTickCount Lib "kernel32" () As Long


Et ensuite tu mets cette procedure dans ton form :

Public Sub Attente(ByVal MilsecToWait As Long)
    Dim lngEndingTime As Long

    lngEndingTime = GetTickCount() + (MilsecToWait)
    Do While GetTickCount() &lt; lngEndingTime
        DoEvents
    Loop
End Sub


Puis pour mettre une pose, tu n'as cas appeller la procédure comme suit :
Attente 2000 ' le temps est en milliseconde..

Voili voilou...

Bonne programmation et A++

DeAtH_-_CrAsH

signaler à un administrateur
Commentaire de Nocturne le 22/12/2002 22:41:55

Salut DeAtHCrAsH,
Tu as raison, je n'avais pas pensé à cette posibilité.
Merci pour ton exemple.
Bonne prog.
A+

signaler à un administrateur
Commentaire de zappy le 23/12/2002 16:12:29 administrateur CS

Sinon un autre solution plus simple serait d'utiliser un timer comme ceci

public sub myTimer_proc()
mytimer.enable = false
end sub

et dans le code
myTimer.enable = true
while myTimer.enable
dovents
wend

Je m'en sert pour mes timeouts de connexion avec winsock. a+

signaler à un administrateur
Commentaire de Nocturne le 23/12/2002 19:59:56

Bonne remarque zappy.
C'est vrai que l'on peut utiliser le composant timer parcontre je pense que cela prend un peut plus de ressources.
Merci et A+

signaler à un administrateur
Commentaire de Nocturne le 26/12/2002 23:33:06

Je reviens sur le commentaire DeAtHCrAsH déposé le 22/12/2002.
Une petite remarque.
Je m'explique, imagine que ton application tourne 24hrs/24.

La fonction Function GetTickCoun renvoi la durée écoulé (en milisecondes) depuis l'allumage du PC.

L'exemple que tu donnes est déclaré en Long donc pour une durée de 2147483647 (milisecondes) soit 24 jours 20 hrs 31 minutes et 23 secondes après il se produira un dépassement de capacité.

Contrairement a mon exemple, le Timer se reinitialise à 0 toutes les 24 hrs.

C'etais simplement une remarque, mais il faut le savoir.

Voili voilou..., A+

signaler à un administrateur
Commentaire de rclsilver02 le 13/05/2003 00:52:30

Bonne remarque Nocturne :)

signaler à un administrateur
Commentaire de rdx83 le 12/05/2004 09:13:09

c'est bien pour ça que Windows plante inévitablement (parce qu'il le fait avant) au bout de 24 jours !!

signaler à un administrateur
Commentaire de nonopirator le 01/03/2005 13:38:28

plus imple...

Public Sub Pause(ByVal Duree As Single, Optional ByVal bloque As Boolean = False)
Dim Debut, courant As Single
Debut = Timer
Do
  If Not bloque Then DoEvents
  courant = Timer
  If courant < Debut Then courant = courant + 24 * 3600
Loop While (Debut + Duree) > courant
End Sub

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.