.NET CompactFramework und Threads (Monitor)
-
Hallo zusammen,
ich stehe vor einem riesigen Problem. Und zwar habe ich eine Klasse RingBuffer progrmmiert. Weiterhin habe ich eine Klasse, die in einem eigenen Thread Daten ließt (z.B. von einer Datei oder einer Messkarte) und diese in den Ringpuffer per Enqueue (siehe Code) schreibt. Auf der anderen Seite habe ich wiederum einen Thread, der die Daten aus dem Ringpuffer ließt (Dequeue). Das Ganze habe ich mit dem Monitor-Konzept (Beschrieben in Loos, Objektorieniertes Programmieren in C#) realisiert. Mit dem .NET Framework gibt es auch keinerlei probleme, da es die Methoden Monitor.Wait() und Moinitor.PulseAll gibt. In .NET CF gibt es diese nicht und damit scheitert dieses Konzept.
Hier meine Methoden Enqueue und Dequeue (nicht ganz vollständig)
public T Dequeue() { Monitor.Enter(this); //Monitor betreten (Thread-Safe!!!) //wenn Puffer leer ist, in den Wartezustand gehen, bis count > 0 ist. Also Daten im Puffer sind) while (this.count == 0) { Monitor.Wait(this); } // Erstes Datum aus RingBuffer entnehmen... // hier nicht vollständig dargestellt Monitor.PulseAll(this); Monitor.Exit(this); }
public void Enqueue(T value) { Monitor.Enter(this); //Monitor betreten (Thread-Safe!!!) //wenn Buffer voll, gehe in den Wartezustand, bis wieder Platz da ist (Dequeue schafft Platz) while (this.count == this.size - 1) { Monitor.Wait(this); } //Datumbei Schreibzeiger schreiben und Schreibzeiger erhöhen. //auch dies ist hier wg. der Lesbarkeit nicht vollständig dargestellt Monitor.PulseAll(this); Monitor.Exit(this); }
Die Codeausschnitte sind natürlich nicht vollständig. Ich habe das Schreiben und lesen, sowie alle Abfragen wg. der Lesbarkeit herausgelassen.
this.count enthält die Elemente, die im Puffer sind, this.size enthält die Kapazität des Ringpuffers.
Hat jemand eine Idee, wie man das ohne Monitor.Wait und PulseAll mit dem .NET Compact Framework lösen kann?
Vielen Dank
Gruß
Kramny