Autor Beitrag
Gabe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Di 20.10.09 18:50 
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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
//Konstruktor
{
...
this.TestTimer.Elapsed += new ElapsedEventHandler(TestTimer_Elapsed);
...
}


Folglich habe ich IN meiner Klasse die Methode
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
void TestTimerElapsed(object sender, ElapsedEventArgs e)
{
// hier möchte ich meine Klassen-Member manipulieren
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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:
ausblenden 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.

ausblenden 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);


   // Daten in Puffer schreiben
   void DatenSchreiben()
   {
      this.Buffer.Add(new DataBufferer() {Name = "Test", Data = TestArray, Number = 1});
      ...
   }
   // Daten aus Puffer lesen
   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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 26.10.09 21:23 
Zwei Informationen fehlen noch: Was sind x,y,z und wo/wie wird der Tick-Eventhandler eingehängt.
user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.
user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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