WindowsForm Timer tappar tid

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: WindowsForm Timer tappar tid

Inlägg 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.
Användarvisningsbild
kimmen
Inlägg: 2042
Blev medlem: 25 augusti 2007, 16:53:51
Ort: Stockholm (Kista)

Re: WindowsForm Timer tappar tid

Inlägg 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.
Borre
Inlägg: 4605
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: WindowsForm Timer tappar tid

Inlägg 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.
Skriv svar