Jeg har lavet et lille program som bruger en timer, oprettet som en control i visual studios visuelle gui miljø. Denne timer er sat til at køre hver 15. millisekund.
Det mærkelige er, at på min ene pc kører den langsommere end på min anden pc, lige indtil jeg åbner windows media player, så kører den hurtigt.
Er disse timere helt upålidelige? Jeg har ikke haft andet end bøvl med dem.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
timere er upålidelige i windows som arne siger. Hvad skal du lave? Hvis det er noget tidkritisk kan det måske være en løsning at måle tiden fra timer aktivering (n-1) til (n), og på den måde få et mere præcist billede af hvor lang tid der går mellem dine "timer events".
Du kan måske lave noget interpolation (ved at bruge tidsintervallet mellem dine timer events) for at finde finde dine værdier ved intervaller på 15.ms?
Interessante råd. Det der undrer mig mest, er at timeren løber hurtigere EFTER jeg starter windows media player. Opdagede det ved et tilfælde fordi jeg skulle se en film.
Jeg bruger timeren til at bevæge cursoren på skærmen(musen), så det er ret tydeligt hvor tit timeren aktiveres, det ses på cursorens hastighed.
hvis du skal flytte musen (dx) i x-retningen og (dy) i y-retningen, kunne du gemme den aktuelle position i doubles og konvertere dem til int når de skal bruges. På den måde kan du bruge decimal-tal når du beregner den nye position for musen. Ideen er så at du kan fremskrive musen position på baggrund af det tidsinterval der er gået fra sidste timer event til nuværende.
hvis din kode oprindeligt er noget med: // Calc dx and dy // ... // Update and Set mouse location x = x+dx; y = y+dy; SetMouseLocation(x,y);
På denne måde vil din kode være afhængig af at den aktiveres ret præcist (via din timer).
!Du kunne overveje at omskrive koden så der tages højde for tidsforskellen:
// Save last activation time DateTime lastActivationTime = globalActivationTime; // set current activation time globalActivationTime = DateTime.Now; TimeSpan eventTimeSpan = DateTime.Now-lastActivationTime; double adjustment = eventTimeSpan/15.0; dx = dx*adjustment; dy = dy*adjustment;
x = x + dx; y = y + dy; SetMouseLocation(int)x, (int)y);
På denne måde tager koden højde for usikkerheden der ligger i dine timerevents.
...faktoren "adjustment" justerer dx og dy. Hvis der er gået 7.5 ms siden sidste event så vil "adjustment" være lig med 0.5. mussecursorens tilbagelægger derfor kun den halve distance og vil befinde sig i det forventede slutpunkt efter 15ms....
Aha ha ha. Genialt forslag, mit indre legebarn er aktiveret og jeg vender tilbage så snart jeg har afprøvet om det er muligt og dermed i sandhed genialt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.