Synchronisation horloge

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Synchronisation horloge

Message par Cls »

Salut à tous,

Je me creuse la tête depuis quelques heures et ça coince quelque part :/

Je souhaite synchroniser une horloge A distante et une horloge B locale.
L'horloge A est au format 'hh:mm:ss', je la récupère sur une page HTML et l'horloge B est tout simplement l'horloge de l'ordinateur auquel j'ajoute un delta, ce qui donne ceci hB = hA + delta. Jusque là tout va bien...

Ensuite, pour prendre en compte le temps que je fasse ma requête vers ma page HTML et que donc quelques centaines de millisecondes peuvent s'écouler, je fais une régulation entre le temps d'exécution de la requête et la valeur récupérée.

Mon souci vient du fait que je ne peut pas stocker ce nombre de millisecondes directement dans mon delta puisque celui - ci est exprimé en seconde.

Ma question est donc la suivante : comment faire exécuter un traitement à une date "HH:MM:SS:milliseconde" donnée sachant que la fonction date() ne prend pas en compte les millisecondes ?

J'ai une ébauche de solution, pourriez - vous me dire ce que vous en pensez : je stocke d'un coté mon deltaSeconde et de l'autre mon deltaMilliseconde.
Lorsque arrive "Heure + deltaSeconde - 1", j'active un timer qui va tourner pendant deltaMilliseconde et ensuite exécuter l'action. J'ai bon ?

Merci d'avance pour vos réponses. En espérant avoir été assez clair.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pourquoi tu n'utilise pas l'heure de l'horloge atomique

en mode NTP ??? 8O

comme ça ton ordi sera a l'heure !! :)


fonctionnement :

tu récupère l'heure de l'horloge atomique
tu met ton pc a l'heure avec


ou alors si c'est pour que 2 ordi est la meme heure

il suffit de lancer le prg de mise a l'heure atomique sur les 2 ordi
au démarrage de l'application, celle-ci commence par mettre le pc a l'heure

comme ça tu es sur, que tout les ordi qui lance l'application
sont a l'heure ... :)


il te suffi de faire executer cette fonction 1 seule fois au demarrage de ton application :

Code : Tout sélectionner

;/ Get Time from NTP Server / Set Local Time / Get Time Zone information
; Droopy 15/01/06 + Fweil for TimeZone functions
; PureBasic 4.10

ProcedureDLL.s GetTimeZoneName() ; Return the name of the Time Zone
      ;/ Author : Fweil
      
      GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
      While TimeZoneInfo\StandardName[i] <>0 And i <= 32
            sStandardName.s + Chr(TimeZoneInfo\StandardName[i])
            i + 1
      Wend
      ProcedureReturn sStandardName
EndProcedure

ProcedureDLL GetTimeZone() ; Hour to add to the UTC hour
      ;/ Author : Fweil
      GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
      retour=-TimeZoneInfo\Bias/60
      ProcedureReturn retour
EndProcedure

ProcedureDLL SetDate(date) ; Set the System Date : Return 1 if success
      Heure.SYSTEMTIME
      Heure.SYSTEMTIME\wYear=Year(date)
      Heure.SYSTEMTIME\wMonth=Month(date)
      Heure.SYSTEMTIME\wDay=Day(date)
      Heure.SYSTEMTIME\wDayOfWeek=DayOfWeek(date)
      Heure.SYSTEMTIME\wHour=Hour(date)
      Heure.SYSTEMTIME\wMinute=Minute(date)
      Heure.SYSTEMTIME\wSecond=Second(date)
      
      If SetSystemTime_(Heure)
            ProcedureReturn 1
      Else
            ProcedureReturn 0
      EndIf
EndProcedure

ProcedureDLL GetNTPTime(NTPServer.s,TimeOut) ; Ask a NTP Server and return the Date as PureBasic format / 0 if it could not be joined
      ; Server = time.ien.it / time.nist.gov / ntp1.fau.de
      
      InitNetwork()
      CnxionId= OpenNetworkConnection(NTPServer,37)
      
      If CnxionId
            
            ;/ Wait until the Server Send Datas
            While NetworkClientEvent(CnxionId)=0
                  Delay(1)
                  t+1
                  If t>TimeOut
                        ProcedureReturn 0
                  EndIf
            Wend
            
            ;/ Wait until the Server Send Datas
            While NetworkClientEvent(CnxionId)=0
                  Delay(1)
            Wend
            
            ;/ Get four Bytes
            Buffer.s=Space(4)
            ReceiveNetworkData(CnxionId,@Buffer,4)
            CloseNetworkConnection(CnxionId)
            
            ;/ Calcule the Date as PureBasic Format ( UTC )
            NTPTime=Asc(Left(Buffer,1))*16777216 + Asc(Mid(Buffer,2,1))*65536 + Asc(Mid(Buffer,3,1))*256 + Asc(Right(Buffer,1)) - 2840140800
            NTPTime=AddDate(NTPTime,#PB_Date_Year,20) ; Add 20 years
            
            ProcedureReturn NTPTime
      Else
            ProcedureReturn 0
      EndIf
EndProcedure

ProcedureDLL GetNTPTime2(NTPServer.s) ; Default TimeOut = 120ms
      ProcedureReturn GetNTPTime(NTPServer.s,120)
EndProcedure

;/ Test
NTPTime=GetNTPTime2("time.ien.it")

If NTPTime
      ;/ Set the Computer Time as NTP Time
      SetDate(NTPTime)
      
      ;/ Show information about Hour
      temp.s="UTC Time : "+FormatDate(" %dd/%mm/%yy %hh:%ii:%ss",NTPTime)+#CR$
      temp+"Zone : "+GetTimeZoneName()+#CR$
      temp+"Shift : "+Str(GetTimeZone())+" hour(s)"+#CR$
      temp+"Local Time as US format : "+FormatDate(" %mm/%dd/%yy %hh:%ii:%ss",NTPTime+GetTimeZone()*60*60)+#CR$
      temp+"Local Time as French format : "+FormatDate(" %dd/%mm/%yy %hh:%ii:%ss",NTPTime+GetTimeZone()*60*60)+#CR$
      MessageRequester("UTC et NTP",temp)
EndIf
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Message par kernadec »

bonjour
sinon tu as cette solution , avec ton horloge windows
tu clic dessus et tu la synchronise avec un server de temps ntp.
exemple : ntp.univ-lyon1.fr
tu as le choix ? j'utilise celui ci dessus.
ici : http://www.dansmongrenier.com/informati ... _ntpd.html
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message par Cls »

Merci pour vos réponses.

Le souci est que je veux me synchroniser avec un site Internet et pas mettre à jour mon horloge système. En fait je veux que mon appli soit en phase avec un site Internet que je n'ai pas fait et sur lequel je n'ai pas le contrôle, tout ceci indépendamment de l'heure courante du PC...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Cls a écrit :Merci pour vos réponses.

Le souci est que je veux me synchroniser avec un site Internet et pas mettre à jour mon horloge système. En fait je veux que mon appli soit en phase avec un site Internet que je n'ai pas fait et sur lequel je n'ai pas le contrôle, tout ceci indépendamment de l'heure courante du PC...
oui mais ton site internet , est forcement a l'heure exacte par rapport a l'horloge atomique !!!
(les serveurs se mettent a l'heure en automatique)

avec la meme heure , ou bien 1,2,3,4,5,6 etc... heures de decalage
mais au niveau des minutes ,secondes, c'est Forcement pareil !! :)

donc les procedures ci dessus mettent ton pc a l'heure
ensuite rien ne t'empeche de ne changer que l'heure ,

les minutes et les secondes sont forcement pareil dans tout les pays ...
Dernière modification par Backup le mar. 12/août/2008 18:24, modifié 1 fois.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message par Cls »

C'est pas bête ce que tu me dis là, Dobro !!

Effectivement, le site est synchro avec cette horloge, ton code va m'être d'une grande utilité !

Merci énormément.
Répondre