begin process at 2010 02 10 09:11:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date & Heure

 > SYNCHRONISATION HORRAIRE (HORLOGE ATOMIQUE) AVEC GESTION DE DÉLAIS

SYNCHRONISATION HORRAIRE (HORLOGE ATOMIQUE) AVEC GESTION DE DÉLAIS


 Information sur la source

Note :
7 / 10 - par 3 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Date & Heure Niveau :Débutant Date de création :21/08/2004 Vu :8 838

Auteur : yannickt

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Ce code sert à synchroniser l'heure de son programme en fonction de l'heure GMT (Greenwich mean time) ou si vous préférez, l'heure internationnale. Quoique déjà présent sur ce réseau, j'ai simplifié le code au max et comme vous le savez certainement, il y a un délais entre le temps d'envoi et de réception d'une donnée sur le net. Or, la NIST (Nationnal Institute of Standards and Technology), la société américaine qui vérifie constament la position de la terre en vue de donner l'heure exacte, inclus dans son envoi, une estimation de ce délais, j'ai donc intégré une façon simple d'obtenir l'heure la plus précise possible, malgré le traffic sur internet.

Pour utiliser ce code, commencez par ajouter un "command Buttons", un "winsock" et deux "timers" dont le "timer1" dont l'intervale doit être à "1000" et doivent tous deux être "enabled = false" et collez ce code, il vous permettra de variabiliser l'heure atomique et de l'incrémenter à chaque seconde, vous en faites ensuite ce que vous voulez...

Source

  • Dim hour As Byte 'variable d'heure
  • Dim minute As Byte 'variable de minute
  • Dim second As Byte 'variable de seconde
  • Dim day As Byte 'variable de jour
  • Dim month As Byte 'variable de mois
  • Dim year As Integer 'variable d'année
  • Private Sub Command1_Click()
  • Winsock1.Close 'on ferme le winsock s'il est ouvert
  • tcptime.Connect "time.nist.gov", "13" 'on se connecte sur le serveur de la NIST
  • End Sub
  • Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  • Dim data As String 'variable de donnée brute
  • Winsock1.GetData data 'chargement de la donnée brute
  • hour = Mid(data, 17, 2) 'on enregistre l'heure
  • minute = Mid(data, 20, 2) 'on enregistre la minute
  • second = Mid(data, 23, 2) 'on enregistre la seconde
  • year = Mid(data, 8, 2) 'l'année
  • month = Mid(data, 11, 2) 'le mois
  • day = Mid(data, 14, 2) 'le jour
  • second = second + 1 'on ajoute une seconde pour compenser pour le délais du net
  • Timer1.Enabled = False 'on arrête le timer1 (qui sert à incrémenter l'heure)
  • Timer2.Interval = 1000 - Mid(data, 31, 3) 'on prends une seconde et on y enlève le délais en MiliSeconde donné par la NIST
  • Timer2.Enabled = True 'on démarre le timer2
  • End Sub
  • Private Sub Timer1_Timer() 'timer d'incrémentation du temps
  • second = second + 1 'plus une seconde
  • If second = "60" Then second = "0": minute = minute + 1 'si on est rendu à 60 secondes, on ajoute une minute et on réinitialise la secondes
  • If minute = "60" Then minute = "0": hour = hour + 1 'si on est rendu à 60 minute, on ajoute une heure et on réinitialise la minute
  • If hour = "24" Then hour = "0" 'pas la peine de nous y attarder!
  • Me.Caption = hour & ":" & minute & ":" & second & " " & WeekdayName(Weekday(year & "-" & month & "-" & day)) & " " & day & " " & MonthName(month) & " " & year 'ça non plus!
  • End Sub
  • Private Sub Timer2_Timer() 'timer de délais
  • Timer2.Enabled = False 'quand on atteint notre délais, on arrête le timer2 et on démarre le timer1
  • Timer1.Enabled = True
  • End Sub
Dim hour As Byte                                'variable d'heure
Dim minute As Byte                             'variable de minute
Dim second As Byte                            'variable de seconde
Dim day As Byte                                  'variable de jour
Dim month As Byte                              'variable de mois
Dim year As Integer                            'variable d'année

Private Sub Command1_Click()
Winsock1.Close                                      'on ferme le winsock s'il est ouvert
tcptime.Connect "time.nist.gov", "13"    'on se connecte sur le serveur de la NIST
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim data As String                               'variable de donnée brute
Winsock1.GetData data                       'chargement de la donnée brute
hour = Mid(data, 17, 2)                        'on enregistre l'heure
minute = Mid(data, 20, 2)                    'on enregistre la minute
second = Mid(data, 23, 2)                    'on enregistre la seconde
year = Mid(data, 8, 2)                          'l'année
month = Mid(data, 11, 2)                      'le mois
day = Mid(data, 14, 2)                          'le jour
second = second + 1                             'on ajoute une seconde pour compenser pour le délais du net
Timer1.Enabled = False                         'on arrête le timer1 (qui sert à incrémenter l'heure)
Timer2.Interval = 1000 - Mid(data, 31, 3) 'on prends une seconde et on y enlève le délais en MiliSeconde donné par la NIST
Timer2.Enabled = True                          'on démarre le timer2
End Sub

Private Sub Timer1_Timer()                          'timer d'incrémentation du temps
second = second + 1                                 'plus une seconde
If second = "60" Then second = "0": minute = minute + 1    'si on est rendu à 60 secondes, on ajoute une minute et on réinitialise la secondes
If minute = "60" Then minute = "0": hour = hour + 1            'si on est rendu à 60 minute, on ajoute une heure et on réinitialise la minute
If hour = "24" Then hour = "0"                                                'pas la peine de nous y attarder!
Me.Caption = hour & ":" & minute & ":" & second & " " & WeekdayName(Weekday(year & "-" & month & "-" & day)) & " " & day & " " & MonthName(month) & " " & year     'ça non plus!
End Sub

Private Sub Timer2_Timer()                          'timer de délais
Timer2.Enabled = False                                'quand on atteint notre délais, on arrête le timer2 et on démarre le timer1
Timer1.Enabled = True
End Sub

 Conclusion

pour plus d'informations concernant la synchronisation horraire, consultez le site web de la NIST (en anglais) au http://www.boulder.nist.gov/timefreq/service/its.h tm

Bonne programmation.


 Sources du même auteur

Source avec Zip Source avec une capture JAUGE HORIZONTALE PROGRESSIVE AVEC SIGNETS

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) FUSEAUX HORAIRES (HORLOGES ANALOGIQUES) par Blodox
Source avec Zip Source avec une capture ANNIVERSAIRE,FÊTES ET DICTONS par claude440
Source avec Zip Source avec une capture CALCULE HEURES DE NUIT 2 par ocejade
NUMÉRO DE SEMAINE par vb5zh
Source avec Zip HORLOGE À AIGUILLES (RADIAN) par brainbass

Commentaires et avis

Commentaire de CanisLupus le 22/08/2004 18:52:37 administrateur CS

Pas mal, mais recherche sur le site, il y a mieux.
Je ne critique pas l'appel à un serveur américain, m'en fous, un serveur c un serveur. Mais toutes tes manipulations de chaine du style mid(...) et autres if second= .... C ça qui ralentit ton prog.
Va voir du côté des Types utilisateur du style :

Private Type SYSTEMTIME
    wYear        As Integer
    wMonth      As Integer
    wDayOfWeek  As Integer
    wDay            As Integer
    wHour        As Integer
    wMinute      As Integer
    wSecond      As Integer
    wMilliseconds As Integer
End Type

Bonne prog

Commentaire de yannickt le 22/08/2004 19:17:54

J'admets que ça aurait pu être encore plus condensé, mais j'ai fait ce code en 15 min, pour ce qui est du serveur, c'étais le seul que j'avais sous la main, mais si vous avez mieux, allez-y fort. J'essayerai d'améliorer le code, mais pour ce qui est des variables, d'habitude, j'utilise des "type" mais comme susmentionné, j'ai voulu rendre le code le plus simple possible, donc! Mais merci quand même de l'intervention .

Commentaire de CanisLupus le 22/08/2004 20:03:54 administrateur CS

Tout ce que je peux dire c que j'utilise le code suivant pour remettre à l'heure mon PC et ça marche ! Ce code vient de vbfrance mais je ne sais  plus qui en est l'auteur, s'il pouvait se manisfester !    

' Programme SYnchronisation de votre PC

' Le serveur NTP écoute sur le port 37
' le client se connecte sur le port 37
' le serveur envoie la date et l'heure sous forme d'un nombre
'  entier de secondes depuis 1900
' le serveur ferme la connexion

Dim sNTP         As String  'trame 32 bits retournée par le serveur SNTP
Dim sngTimeDelay As Single  'temps écoulé entre la connection au serveur
                            'et les données recues.
                            'la correction à apporter est égale
                            'à la moitié de cette valeur


Private Declare Function SetSystemTime Lib "kernel32" _
     (lpSystemTime As SYSTEMTIME) As Long
    
Private Type SYSTEMTIME
    wYear        As Integer
    wMonth      As Integer
    wDayOfWeek  As Integer
    wDay            As Integer
    wHour        As Integer
    wMinute      As Integer
    wSecond      As Integer
    wMilliseconds As Integer
End Type

Sub Form_load()
    Me.Hide
    With Winsock
        .Close
        sNTP = Empty
        '
        ' Nom du serveur de temps NTP.
        ' L'heure suisse même atomique c'est autre chose !
        .RemoteHost = "ntp.metas.ch"
        '
        ' Connection sur le port dédié 37. (RFC 1305, 1361, 2030)
        '
        .RemotePort = 37
        .Connect
    End With
End Sub

Private Sub WinSock_DataArrival(ByVal bytesTotal As Long)
     Dim sData As String

     Call Winsock.GetData(sData, vbString)
     sNTP = sNTP & sData
End Sub
Private Sub WinSock_Connect()
    sngTimeDelay = Timer 'temps écoulé depuis minuit
End Sub
Private Sub WinSock_Close() 'le serveur ferme la connection
     On Error Resume Next

     Do Until Winsock.State = sckClosed
        Winsock.Close
        DoEvents
     Loop

     sngTimeDelay = ((Timer - sngTimeDelay) / 2) 'correction en secondes à apporter entre la connection et la fermeture de connection
     Call SyncClock(sNTP)
End Sub
Private Sub SyncClock(sTemp As String)
     Dim dblNTPTime     As Double   ' réponse temps en secondes écoulées depuis 1900
     Dim UTCDATE         As Date
     Dim LngTimeFrom1990 As Long
     Dim ST             As SYSTEMTIME
    
     sTemp = Trim$(sTemp) ' élimine les espaces à droite et gauche
     If Len(sTemp) <> 4 Then    ' vérifie la longueur de la chaine de retour 4 caractères
        Call MsgBox("le serveur NTP retourne une réponse invalide.", _
                vbCritical, "Réponse invalide")
        Exit Sub
     End If

     ' décodage de la chaine de 4 caractères ACII retournées
     dblNTPTime = Asc(Left$(sTemp, 1)) * 256 ^ 3 + Asc(Mid$(sTemp, 2, 1)) * 256 ^ 2 + _
     Asc(Mid$(sTemp, 3, 1)) * 256 ^ 1 + Asc(Right$(sTemp, 1))
        
     LngTimeFrom1990 = dblNTPTime - 2840140800# 'temps en secondes depuis 1990
    
     ' correction de la date introduite au système
     UTCDATE = DateAdd("s", CDbl(LngTimeFrom1990 + CLng(sngTimeDelay)), #1/1/1990#)

     With ST
        .wYear = Year(UTCDATE)
        .wMonth = Month(UTCDATE)
        .wDay = Day(UTCDATE)
        .wHour = Hour(UTCDATE)
        .wMinute = Minute(UTCDATE)
        .wSecond = Second(UTCDATE)
     End With

     Call SetSystemTime(ST)
     Call MsgBox("Horloge PC synchronisée avec succés.", vbInformation, _
     "Mise à l'heure réussie")

End Sub

Si ça peut te servir......

Bonne prog

Commentaire de Scalpweb le 23/08/2004 15:22:41

Et voilà CanisLupus qui nous sort une source dans un commentaire, lol.
Sinon, bonne source.

Commentaire de CanisLupus le 23/08/2004 20:32:49 administrateur CS

ben, je sais, c pas top mais comme je n'ai pas retrouvé l'adresse ...... cela dit, la source de yannickt est bonne aussi.

Commentaire de yannickt le 24/08/2004 23:08:38

loll

Commentaire de bca le 28/10/2006 00:50:34

Lors de l'execution de votre code une erreur apparait
il fallait remplacer tcptime par dans la ligne 10

Commentaire de lonekiller le 03/08/2009 23:19:12

CanisLupus, tu parles de l'usage de "mid" qui ralentit le prog de yannickt mais il se trouve que ta source fait exactement pareil ^^

Yannickt, ta source a un gros défaut... Il ne se situe pas dans le traitement des données du serveur (qui est très bien ma foi), mais dans ton horloge à base de timers.
En effet, à partir du moment ou un Timer déclenche son code, il est en pause, et il ne repart qu'après l'exécution de son code.

Autrement dit, si ton code dans le "Sub Timer1_Timer()" mets un dixième de seconde à s'exécuter, alors ton horloge perd un dixième de secondes toutes les secondes...

l'utilisation de la fonction Timer() devient ici intéressante. La source de CanisLupus en tire profit mais pas dans ce sens.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales