Sida 2 av 2

Re: WindowsForm Timer tappar tid

Postat: 25 november 2013, 15:20:00
av sneaky
Oj, tråden fick nytt liv helt plötsligt ser jag hehe. Jag gjorde helt enkelt så att jag baserade det hela på klockan, funkar fint för det jag vill göra.

För framtida arkeologer som snubblar över tråden. Semi-pseudo-kod:

Kod: Markera allt

    public partial class Form1 : Form
    {
        private System.Timers.Timer OneSecTimer = new System.Timers.Timer();

        public Form1()
        {
            OneSecTimer.Interval = 1000;
            OneSecTimer.Elapsed += updateTime;
            OneSecTimer.AutoReset = false;
            // Timern startas i en annan del av koden som inte är inkluderad här
        }

        private void updateTime(object sender, System.Timers.ElapsedEventArgs e)
        {
            foobar++;
            OneSecTimer.Interval = 1000 - DateTime.Now.Millisecond;
            OneSecTimer.Start();
        }

        // En windows forms timer som körs ungefär en gång per sekund
        private void timer1sec_Tick(object sender, EventArgs e)
        {
            // Gör det riktiga jobbet här baserat på värdet av foobar
        {
}
Det kanske ser lite konstigt ut att jag fortfarande gör jobbet i en vanlig oexakt timer men det viktiga i det här fallet är att "foobar" uppdateras korrekt.

Re: WindowsForm Timer tappar tid

Postat: 25 november 2013, 22:43:26
av kimmen
JimmyAndersson skrev: Det vore intressant att veta hur pass ofta som detta "regulary" är.
Jag menar, om uppdateringen från RTC'n verkligen fungerade så skulle Windows
inte behöva ha någon inbyggd NTC-klient som uppdaterar klockan en gång i veckan.
Jag tror inte de menar att den läser RTC:n, utan de menar att klockan uppdateras från andra tidskällor.

Vet du med säkerhet att RTC:n på de där maskinerna gick noggrannare än vad "System Time" gjorde? Kan det inte bara vara så att moderkortets oscillator är onoggrann? Men det är väl inte otänkbart att systemet skulle kunna missa timerinterrupt och halka efter om något är fel i en drivrutin och den blockerar för länge. Möjligen används två olika klockkällor också.

Men i alla fall, om det är ett visst intervall som önskas på körningen här så borde GetTickCount64 vara ett bra alternativ. Det står på sidan om "System Time" att detta är det rekommenderade sättet eftersom "System Time" kan hoppa.

Men se upp med följande:
The elapsed time retrieved by GetTickCount or GetTickCount64 includes time the system spends in sleep or hibernation.
Risken finns ju då att om man sätter systemet i sleep ett dygn försöker programmet köra ikapp de tappade 86400 sekunderna när man går ur sleep. Då kanske QueryUnbiasedInterruptTime kan vara en bättre lösning.

Re: WindowsForm Timer tappar tid

Postat: 25 november 2013, 23:16:01
av Borre
Vill man att Windows NTP-klient ska uppdatera oftare är det bara ändra "SpecialPollInterval" i registret, kolla här:
http://blogs.msdn.com/b/w32time/archive ... erval.aspx

Löste problem jag hade med en klen dator, en AMD Geode 200MHz, som kör Windows XP för att logga temperaturer och lite sånt. Den belastas för fullt i ungefär sju minuter av tio och så fortsätter det om och om igen. Märkte att klocka halkade efter mer och mer för varje dag så det löste sig genom att ändra uppdateringsintervallet till ett dygn.