Page 1 sur 1

Mon PC avance... (heure)

Publié : lun. 01/oct./2012 22:17
par Golfy
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 ?)

Re: Mon PC avance... (heure)

Publié : mar. 02/oct./2012 0:12
par Backup
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