Timer ultra longue durée, sans raz à minuit

Soyez le premier à donner votre avis sur cette source.

Vue 7 608 fois - Téléchargée 795 fois

Description

Basé sur le Timer Windoz, qui a la mauvaise particularité de compter jusqu'à 86399 secondes puis se remettre à 0 à minuit, la petite application réalisée ici permet de conserver sa précision à 1ms près (rafraîchissement du timer VB) tout en étendant le temps de comptage à 1.7E+308 secondes ou kek'choz kom'ça... En outre, l'appli' renvoie la valeur Double en Public, afin que ce "super timer" bateau puisse être exploité.

Source / Exemple :


Dim consigneTimer As Double 'valeur de départ du Timer
Dim minuit As Boolean 'détection du passage à minuit
Dim minuitOK As Boolean 'validation du premier passage à minuit
Dim jours As Integer 'nombre de jours implémentés
'Activation et désactivation du supertimer
Private Sub depart_Click()
    If depart.Caption = "Go !" Then
        Timer1.Enabled = True
        depart.Caption = "Stop"
    Else
        Timer1.Enabled = False
        depart.Caption = "Go !"
    End If
End Sub
'initialisation des variables
Private Sub Form_Load()
    consigneTimer = Timer
    minuit = False
    minuitOK = False
    jours = 0
End Sub
'réinitialisation des variables
Private Sub raz_Click()
    consigneTimer = Timer
    minuit = False
    minuitOK = False
    jours = 0
    afficher.Caption = "0"
    afficherJours.Caption = "0"
    afficherTimer.Caption = CStr(Timer)
End Sub
'rafraîchissement de la fonction superTimer et de l'affichage
Private Sub Timer1_Timer()
    superTimer
    afficher.Caption = CStr(Round(superTimer, 2))
    afficherTimer.Caption = CStr(Timer)
    afficherJours.Caption = CStr(jours)
End Sub

'Calculs du supertimer en fonction de la valeur de consigne,
'du premier passage à minuit et du nombre de jours
Public Function superTimer() As Double

    'On détecte que l'on s'apprète à passer à minuit
    If Timer > 86398 Then minuit = True
    
    'On vient de passer minuit pour la première fois
    If (minuit = True) And (Timer < 1) And (jours = 0) And (minuitOK = False) Then
        'On observera la valeur opposée à celle de consigne désormais...
        consigneTimer = 86400 - consigneTimer
        'On se prépare déjà pour le prochain passage à minuit
        minuit = False
        'On garde "à l'esprit" que l'on a déjà passé minuit une première fois...
        minuitOK = True
    End If
    
    'On vient de passer minuit une seconde fois ou au-delà
    If (minuitOK = True) And (minuit = True) And (Timer < 1) Then
        'On incrémente le nombre de jours de fonctionnement du supertimer
        'ce nombre de jours est considéré sur les passages à minuit,
        'et non pas sur les passages du Timer à la valeur de consigne...
        jours = jours + 1
        'On se prépare pour le prochain passage à minuit
        minuit = False
    End If
    
    'On n'a pas encore passé minuit une seule fois...
    If minuitOK = False Then
        'On considère alors l'écart entre le Timer et la valeur de consigne...
        superTimer = Timer - consigneTimer
    'On a déjà passé minuit une ou plusieurs fois...
    Else
        'On considère la consigne recalculée + le timer
        ' + le nombre de secondes par jours déjà passés
        superTimer = consigneTimer + Timer + (86400 * jours)
    End If
    
End Function

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

bennybenben
Messages postés
7
Date d'inscription
lundi 18 août 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Alors laisse-moi te remercier pour ces petites précisions, qui me permettent de mieux apprécier ma problématique d'alors : en effet, il s'agit bien du timer de VB6 à mon sens, nullement celui de Window$ 2000 (oui, mon outil tournait sous 2000)...

Je suis toujours un peu speed quand je m'oblige à me justifier, mais je ne cherche jamais à me montrer agressif, alors excuse-moi pour la pression que je t'ai mise. Ce n'est pas la faute à la chaleur, encore moins au foot (même si je regrette de passer pour un extra-terrestre), mais je dois reconnaître que ces derniers temps, pour mon entourage comme pour moi, le stress a été important... Heureusement que les études se terminent ! :-D

Tchô et bonne continuation,
ben.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
Je me tamponne menu menu du foot, inutile d'épiloguer.

Si je mets une rectif, le but n'est pas d'enfoncer mais d'éclaircir.
On reprend donc dans le calme:
que ton prog vb ait qlq problème de timer, personne ne le met en doute mais pour autant ce n'est pas du au timer de WINDOWS, peut-être à celui de VB, là aucune idée mais c'est fort possible.
Il est clair que VB est fini mais si tu devais avoir de nouveau un jour à te servir de timer long en VB, tu pourrais directement utiliser Windows par SetTimer() et lui passer une fonction callback par AddressOf.

La chaleur n'excusant pas tout, voyons de continuer dans le calme et la sérénité.
bennybenben
Messages postés
7
Date d'inscription
lundi 18 août 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Merci, coco, de préférer m'enfoncer (sans pour autant prendre la peine de t'expliquer clairement) plutôt que de chercher à construire une analyse autour de ce bout de code... Laisse-moi seulement te dire ceci :
- Ton commentaire ne m'avance pas et ne m'avancera plus, puisqu'il y a belle lurette que je ne suis plus sur le développement de mon outil en VB6
- 86400 secondes font bien 24 heures ; et si je prétends que mon programme connaissait des difficultés, ce n'est pas parce que j'ai deux main gauches ou parce que j'ai appris le VB en autodidacte (même s'il est vrai que je suis peut-être un autodidacte un peu gauche)...
- Pour moi, VB6, c'est terminé, et j'espère pour un bon bout de temps... Depuis quelques mois, je suis sur un logiciel développé en Java : je suis convaincu que ton génie pourrait m'éclairer, mais je ne suis pas sûr de vouloir partager quoi que ce soit avec quelqu'un de manifestement obtu... et pourtant, je peux te garantir que je prône l'échange et les logiciels libres !
- Tu soutenais peut-être le Brésil, mais voilà, la France a gagné 1-0... Tu aurais dû faire comme moi : maudir le tapage fait autour du foot, sourire gentiment aux supporters, et aller t'éclater à la plage en Normandie !

Sans rancune vieux frère, à une prochaine fois peut-être.
ben.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13 -
"timer Windows" jusqu'à 86399 secondes, de quoi tu parles ??? jamais vu cela dans l'API Windows.
SetTimer() supporte une plage de 2 147 483 secondes et je n'ai jamais constaté de reset à minuit.
pekch
Messages postés
51
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
7 juillet 2006
-
ceci dit je pense que le timer de windows n'es pas precis en deca de 100ms... la ms c'est meme pas la peine d'y compter!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.