Laden...

IF-Abfrage beeinflusst Timerintervall!!!

Erstellt von amozi vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.758 Views
A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren
IF-Abfrage beeinflusst Timerintervall!!!

Hallo,

seit heutmorgen habe ich mit einem sehr komischen und nervenauftreibenden Phänomen zu tun. Und zwar ist es so: Ich habe einen ganz normalen Timer mit einer ents. Routine. In dieser Routine wird wiederum eine Funktion "Zeichnen()" aufgerufen, wobei die Aufrufrate(Intervall) auf 50 ms festgelegt wurde. Jetzt ist es so, dass in der "Zeichnen"-Funktion vier if abfragen vorhanden sind. Bei vier oder drei Abfagen (if-else if-else if-else if) fängt das Timerintervall an, sich zu variieren. Aber bei zwei (if-else) bleibt es constant wie es festgelegt wurde. Kann mir jemand sagen wovon das abhängig sein kann?
Und noch was, die Zeit für "Zeichnen()" ist definitiv kleiner als das Timerintervall (Faktor 2).

(Soll ich vielleicht bischen Code posten?)

Danke

Danke
amozi

S
8.746 Beiträge seit 2005
vor 18 Jahren

50ms in schon unter der Minimalauflösung. Wenn du jetzt noch ein wenig Zeit für das Zeichnen verschwendest, kann es gut sein, dass irgendwann eine Timer-Botschaft die andere überholt. Das führt dazu, dass beim Überholen ein Event ausbleibt (hängen zwei Timer-Events in ein der Message-Queue, wird die älteste gelöscht). Insofern bist du wirklich schon an der Grenze des Machbaren. Da kann ein kleines "if" durchaus ein Änderung des Laufzeitverhaltens bewirken.

187 Beiträge seit 2005
vor 18 Jahren

ich weiss nur, dass der timer nicht anspringt, wenn er noch code auszuführen hat.

wenn die ausführungszeit über 50ms ist wird der timer meines wissens warten bis der code abgearbeitet wurde.

Das ist aber keine 100%ig getestete aussage. Ich vermute es aus eigener erfahrung

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Vassili,

Windows ist ja ein Multitaskingsystem. Das heißt es kommt nicht nur auf die Ausführungszeit deiner Routine an, sondern auch auf die anderen Prozesse (selbst wenn die nicht viel tun oder nicht oft).

herbivore

S
8.746 Beiträge seit 2005
vor 18 Jahren

In jedem Falle kannst du dich keinesfalls darauf verlassen, dass wirklich genau alle 50 ms (+/- x) ein Event ausgelöst wird. Sie können sich verspäten oder sogar ganz ausbleiben (bei Überholung).

308 Beiträge seit 2005
vor 18 Jahren

Hallo amozi,

eventuell solltest du den Timer nicht im Intervall aufrufen, sondern einmalig mit 50ms, und dann immer wieder nach Beendigung von Zeichnen() neu triggern.
Wenn du noch die Zeit mißt, die Zeichnen() benötigt kannst du den erneuten Intervall auch dynamisch erzeugen (Math.Max(5,50-TimeTaken) -> mindestens 5ms warten, damit die Funktion nicht rechner lahm legt) .

So mach ich das bei Timern, die unter Umständen für die Ausführung länger benötigen als der gewünschte Intervall.

Alternativ kannst du auch einen Thread nehmen, der in einer Endlosschleifte (d.h. bis ein Event das schliessen der Applikation miteilt) Zeichnen() ausführt und dann ein Thread.Sleep(Math.Max(5,50-TimeTaken) nach jedem Durchlauf ausführt.