Entwickler-Ecke
C# - Die Sprache - Timer / Objekt / Instanz - Problem
Gabe - Di 20.10.09 18:50
Titel: Timer / Objekt / Instanz - Problem
Hallo zusammen,
ich bin mir nicht sicher, ob ich ein wirklich größeres Problem habe, bisher alles falsch ist, was ich gemacht habe, oder einfach nur auf dem Schlauch stehe. Hoffe es kann mir jemand helfen...
Ich habe hier eine Klasse, von der ich mehrere Objekte erstelle.
In der Klasse ist ein System.Timers.Timer deklariert.
Im Konstruktor der Klasse erstelle ich den Eventhandler für den Timer.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| { ... this.TestTimer.Elapsed += new ElapsedEventHandler(TestTimer_Elapsed); ... } |
Folglich habe ich IN meiner Klasse die Methode
C#-Quelltext
1: 2: 3: 4: 5: 6:
| void TestTimerElapsed(object sender, ElapsedEventArgs e) { this.options = 1234; ... } |
Funktion ist folgende: Mein Objekt wird erzeugt und arbeitet.Nach einer gewissen Zeit wird der Timer aktiv und verändert das Klassenmember.
Wenn ich nur ein Objekt habe funktioniert alles einwandfrei. Habe ich aber mehrere Objekte wird die TestTimerElapsed-Methode nicht innerhalb des zugehörigen Objektes aufgerufen, d.h. ich manipuliere ein anderes Objekt und bekomme so ein Fehlverhalten.
Kann mir jemand erklären wo mein Fehler liegt? Das mit dem Timer innerhalb der Klasse aufrufen kommt mir irgendwie falsch vor....!
Danke schon mal für Antworten.
Gruß Gabe
Kha - Di 20.10.09 21:20
Von hier aus ist kein Fehler erkennbar :nixweiss: . Zeig mal etwas mehr Code von der Klasse und beschreibe vor allem, wie du das "Fehlverhalten" festgestellt hast.
Gabe hat folgendes geschrieben : |
Das mit dem Timer innerhalb der Klasse aufrufen kommt mir irgendwie falsch vor....! |
Kann schon sein, dafür müssten wir aber erst einmal wissen, was du vorhast ;) .
Gabe - Do 22.10.09 20:43
Hi,
ist ein bissel größer das Ganze.
Hab nur gerade noch andere Sachen zu tun. Ich melde mich... :-)
Gruß Gabe
Gabe - Mo 26.10.09 11:57
So, heute morgen war ich auf der falschen Fährte, jetzt eine genauere Beschreibung.
Ich habe einen Datenpuffer als Klasse definiert:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| class DataBuffer { public string Name {get; set;} public byte[]Data {get; set;} public int Number {get; set;} } |
Jetzt habe ich eine Klasse in der eine Protokollbearbeitung stattfindet.
In der Klasse wird der Datenpuffer verwendet, um empfangene Daten zwischenzuspeichern und nach Ablauf eines Timers aus dem Puffer wieder herauszulesen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| class Protocol { ... List<DataBuffer> Buffer = new List<DataBuffer>(); System.Timers.Timer TimerDatenLesen = new System.Timers.Timer(10000);
void DatenSchreiben() { this.Buffer.Add(new DataBufferer() {Name = "Test", Data = TestArray, Number = 1}); ... } void DatenLesen() { x = this.Buffer[0].Name; y = this.Buffer[0].Data; z = this.Buffer[0].Number; } void TimerDatenLesen_Elapsed(object sender, ElapsedEventArgs e) { this.DatenLesen(); } } |
Jetzt habe ich mehrere Objekte dieser Klasse Protokoll. Die unterschiedlichen empfangenen Daten werden in die jeweiligen Puffer geschrieben. Das funktioniert alles.
Das Problem:
Bei mehreren Objekten, werden beim Lesen aus dem Puffer immer aus dem Objekt die Daten gelesen, das zuletzt Daten empfangen hat.
D.h. ich verweise irgendwie immer auf einen bestimmten Datenpuffer und nicht auf den Puffer, der zu dem jeweiligen Objekt eigentlich gehört.
Beispiel:
Objekt 1 empfängt "r"
Objekt 2 empfängt "s"
Objekt 3 empfängt "t"
Timer von Objekt 1 löst aus:
Objekt 1 liest aus Puffer "t"
Timer von Objekt 2 löst aus:
Objekt 2 liest aus Puffer "t"
Timer von Objekt 3 löst aus:
Objekt 3 liest aus Puffer "t"
Ich hoffe es ist soweit verständlich, ansonsten einfach fragen. Würd mich freuen, wenn mir da jemand helfen könnte.
Gruß Gabe
Kha - Mo 26.10.09 21:23
Zwei Informationen fehlen noch: Was sind x,y,z und wo/wie wird der Tick-Eventhandler eingehängt.
Gabe hat folgendes geschrieben : |
Das mit dem Timer innerhalb der Klasse aufrufen kommt mir irgendwie falsch vor....! |
Sieht wirklich so aus ;) . er sollte wohl vielmehr in der View (Form-Klasse/...) sitzen.
Gabe - Mo 26.10.09 22:07
Wir können uns auf y beschränken. Rest ist nicht so wichtig.
y ist ein byte[] mit der Länge von 4 Feldern.
Der Elapsed-Eventhandler wird im Konstrukor der Klasse deklariert. Habe ich ja im ersten Post schon geschrieben.
Die Daten werden richtig in die verschiedenen Datenpuffer der zugehörigen Objekt geschrieben.
Nur beim Lesen passt der Zugriff nicht.
In der Form helfen mir die Timer nichts, da ich ja für jedes Objekt einen Timer benötige. Oder wie meinst du das?
Kha - Mo 26.10.09 22:57
Naja, von der Theorie her passt immer noch alles. Also muss es weiterhin an Code liegen, den du noch nicht gezeigt hast. Ein halbwegs in sich abgeschlossenes Beispiel wäre schön.
Gabe hat folgendes geschrieben : |
In der Form helfen mir die Timer nichts, da ich ja für jedes Objekt einen Timer benötige. Oder wie meinst du das? |
Wenn alle Timer die gleiche Frequenz besitzen, könntest du dich doch auch auf einen Timer für alle Objekte beschränken?
Gabe - Mi 28.10.09 16:38
So, möchte diesen Thread hier noch beenden:
Hatte ein ganz anderes Problem. Die Daten, die ich empfing, kamen zu schnell und ich überschrieb dadurch meine Werte. Daher kam es zu so einem komischen Verhalten.
Hab es jetzt gepuffert. Jetzt ist alles einwandfrei.
Die Timer habe zwar alle die gleiche Frequenz, werden in den Objekten aber unterschiedlich gestartet. Daher hilft mir kein übergeordneter Timer.
Danke Kha fürs Antworten.
Gruß Gabe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!