Page 1 sur 1
Synchronisation horloge
Publié : mar. 12/août/2008 16:19
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.
Publié : mar. 12/août/2008 16:30
par Backup
pourquoi tu n'utilise pas l'heure de l'horloge atomique
en mode NTP ???
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
Publié : mar. 12/août/2008 17:11
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
Publié : mar. 12/août/2008 17:32
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...
Publié : mar. 12/août/2008 18:20
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 ...
Publié : mar. 12/août/2008 18:23
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.