Comme c'est la première fois que je vois ça, je voulais partager des astuces.
Tout d'abord, le composant RTC de la carte mère n'est pas en cause, ni la batterie !
L'heure du BIOS est donc correcte et les secondes s'écoulent normalement...
... sous WinXP, il n'en est pas de même : l'horloge prend presque 1 seconde d'avance toute les 5 secondes écoulées...
Donc,
1) voir l'association win32time et w32tm (http://technet.microsoft.com/en-us/libr ... s.10).aspx)
2) Utiliser l'application ClockMon (qui synchronise l'heure Windows avec l'heure du composant interne RTC : http://www.softdevlabs.com/ClockMon/ClockMon.html).
3) utiliser de temps en temps une synchronisation NTP (mais pas la peine de le faire trop souvent si le RTC est fiable)
Voilà ! si vous avez aussi rencontré des problèmes de ce genre là dans vos programmations, dites-le moi (je vais faire des recherches de mon coté... utilisation intensive des eventtimers ?)
Mon PC avance... (heure)
Mon PC avance... (heure)
Dernière modification par Golfy le mar. 02/oct./2012 7:06, modifié 1 fois.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
http://golfy.olympe.in/Teo-Tea/
Re: Mon PC avance... (heure)
pour mettre a l'heure l'ordi avec Purebasic :
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("ntp.unice.fr") ;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
;
; EPB