Mon PC avance... (heure)

Sujets variés concernant le développement en PureBasic
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Mon PC avance... (heure)

Message 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 ?)
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/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Mon PC avance... (heure)

Message 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 





Répondre