Entwickler-Ecke

Basistechnologien - Timerverhalten unerwartet


Max064 - Mo 13.09.10 10:46
Titel: Timerverhalten unerwartet
Hallo,

ich nutze einen Timer (Interval = 30). Der Timer wird auch ganz normal ausgeführt. Innerhalb des Timers nutze ich (unter bestimmten Bedingungen) die Methode


C#-Quelltext
1:
timer.Stop();                    


Der Event Handler des Timers wird dann bis zum Ende ausgeführt (dieser Programmcodeteil könnte relativ langwierig sein). Direkt im Anschluss wird jedoch der Event Handler des Timers nochmals aufgerufen (manchmal sogar noch 2mal). Erst dann legt sich der Timer komplett zur Ruhe.

Stauen sich da vllt die Aufrufe des Timers auf, sodass er nach Abschaltung nochmals aufgerufen wird???

EDIT: Um es noch ein bisschen spannender zu machen: Der nachträgliche Aufruf passiert nur, wenn der Timer schon mal gestartet und gestoppt worden ist. Also wenn der Timer noch nie vorher gestoppt worden war, funktioniert es...

lg Max


danielf - Mo 13.09.10 11:04

Hallo,

kann es sein, dass du das Elapsed-Event öfters registrierst (Start/Stop-Method) und sie sich deshalb "Stauen"? Interval = 30ig bedeutet alle 30ig Millisekunden! Das ist sehr knapp :)

Gruß


Max064 - Mo 13.09.10 11:23

Deswegen mache wende ich ja die Stop Methode an, bevor die lange Programmlaufzeit stattfindet. Das heißt der Stop wird auf jeden Fall innerhalb der 30 ms ausgeführt.

Zur Kontrolle hatte ich das intervall eben auf 500 ms raufgesetzt... mit dem gleichen Ergebnis...


danielf - Mo 13.09.10 13:13

Welcher Timer verwendest du den genau? (mit Namespace)


Max064 - Mo 13.09.10 13:24

Wie meinst du das?

Ich definiere den Timer so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
Timer timer2;
timer2 = new Timer();
timer2.Interval = 30;
timer2.Tick += new EventHandler(timer_flash1);
timer2.Start();
timer2.Stop();


lg Max


danielf - Mo 13.09.10 13:27

Im .NET Framework gibt es 3 Klassen Timer:

Namespace: System.Timers
Assembly: System (in system.dll)

Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)

Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)

Ich vermute du hast eine Windows Forms-Anwendung und dementsprechend die Dritte Variante. Wenn du in Visual Studio mit der Maus über den Timer gehst siehst du den kompletten Name des Timers (mit Namespace).

Gruß


Max064 - Mo 13.09.10 15:51

Es ist System.Windows.Form!


Kha - Mo 13.09.10 18:47

Da der Timer Window Messages benutzt und diese als Queue abgearbeitet werden, kann das durchaus passieren. Schau doch am Anfang der Methode einfach nach, ob der Timer überhaupt an ist?


Ralf Jansen - Mo 13.09.10 18:52

Vielleicht eher den System.Timers.Timer verwenden?
Bei Autoreset = true(Timer feuert dann garantiert nur genau 1 mal) kannst du dann im Elapsed EventHandler den Timer neustarten wenn du in nochmal brauchst anstatt wie jetzt umgekehrt in anzuhalten wenn du in nicht mehr brauchst. Erscheint mir wesentlich problemloser.


Max064 - Do 16.09.10 08:04

Vielen Dank für die Hilfe, aber ich habe das ganze nicht weiterverfolgt.

Ich benutze nun einfach eine Boolesche Variable, um beim letzten (ungewollten) Durchlauf die Abarbeitung mit if zu verhindern.

lg Max