ich habe folgendes Problem: ich möchte eine Art Zwischenspeicher, im folgenden Cache genannt, für eine regelmässig (jede Sekunde) eintreffende Wertemenge erstellen. Hierzu habe ich mir ein Objekt "Cache" erstellt, welches als Array über die zu speichernden Werte realisiert ist.
public class Cache
{
private CacheItem[] speicher;
// Wie groß wird der Cache
int size = 0;
// aktuelle Zelle im Array
int last = 0;
public Cache(int size)
{
this.size = size;
speicher = new CacheItem[size];
last = 0;
}
public void addItem(CacheItem item)
{
// Überlauf?
if (size == last)
{
last = 0;
}
//MessageBox.Show("Position: " + last);
speicher[last] = item;
last++;
}
}
Die Definition von CacheItem lass ich hier mal aussen vor, da sie wohl kein Problem darstellen wird. Nun folgende Idee hinter dieser Realisierung. Eine Cache wird mit einer festen Größe erstellt. Z.B. new Cache(30) - erzeugt mir einen Cache der 30 Elemente maximal aufnehmen kann. Wenn ich beim letzten Element des Array angekommen bin, möchte ich wieder von vorne anfangen, also das Element in der 1. Zelle überschreiben. D.h. der Zeiger "last" zeigt immer auf das aktuelle freie bzw. zu überschreibene Element im Array.
Leider habe ich jetzt das Problem, dass dieser Zugriff wohl nicht atomar läuft - wundert mich auch nicht wirklich. Die Funktion addItem() wird von verschiedenen externen Funktionen oftmals aufgerufen und es kommt vor, dass ein Element eingefügt wird, das nächste Element diese Element aber direkt überschreibt - weil der Zeiger last nicht schnell genug um eins erhöht wird/wurde.
Daher meine prinzipielle Frage: ist die Implementierung mittels Arrays hier überhaupt sinnvoll? Ich bräuchte sowas wie eine undliche bzw. zyklische Liste fester Länge. Sobald ich ans Ende angekommen bin, sollte wieder vorne eingefügt bzw. überschrieben werden.
Was meint Ihr - ist mein Ansatz zu gebrauchen oder soll ich eine andere Datenspeicherungmethode wählen?
P.S: Als Diagnose haben ich den(auskommentierten) MessageBox-Dialog genutzt. Lass ich mein Programm laufen kommen dann Dialogboxen mit
Position: 0
Position: 0
Position: 0
Position: 1
Position: 1
Position: 1
Position: 2
usw...
d.h. jede Zelle wird 3 mal hintereinander beschrieben.