Code:
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (spiel)
{
Random rnd = new Random();
spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
Bitmap bmp = spiel.Zeichne();
this.BackgroundImage = null;
this.BackgroundImage = (Image)bmp.Clone();
}
}
lock(spiel) Damit nicht im schlimmsten fall das Zeichenn zu lange dauert und durch
spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000),
ein Error entsteht.
this.BackgroundImage = (Image)bmp.Clone();
Damit auf die bmp weiter zugegriffen werden kann. Hierbei entsteht aber so ein speicherleck (altes Bild muss gelöscht werden)
Also (das ist hier noch nicht drin)
statt this.BackgroundImage = null;
ein
Code:
if (this.BackgroundImage != null)
{
this.BackgroundImage.Dispose();
}
bzw. danach kannste auch gerne nochmal auf null setzen.
Allerdings wird beim ReRendern wohl ein Fehler auftreten, da der BackgroundImage im gleichen thread geändert werden sollte.
Da wäre es vll besser auf Forms.Timer zurück zu greifen. Dieser sollte im gleichen Thread ablaufen ( wenn ich nicht ganz doof bin)
Dass ich bei sowas immer soviel editiere... Erst denken dann schreiben... wann lern ichs endlich (Vergib mir, wenns ein wenig wirr ist, bin gerade stark unterzuckert, ich guck morgen nochmal drüber):
Also du solltest auf Form-Elemente nur aus dem Form-Thread zugreifen. Dazu könntest du hier einen extra Timer schreiben:
Code:
t2 = new Timer();//System.Windows.Forms.Timer
t2.Interval = 2;
t2.Tick += new EventHandler(t2_Tick);
t2.Start();
Deine alte Timer-Funktion würde das aktuelle Bild einspeichern:
Code:
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (spiel)
{
Random rnd = new Random();
spiel.elementlist.Add(new Linie(new Point(rnd.Next(1000), rnd.Next(1000)), new Point(rnd.Next(1000), rnd.Next(1000)), new Pen(Brushes.Black)));
Bitmap bmp = spiel.Zeichne();
this.bgImages = (Image)bmp;
}
}
Hier muss es nun nicht mehr kopiert werden, da wir das im anderen Timer machen
Code:
void t2_Tick(object sender, EventArgs e)
{
lock (spiel)
{
if (this.BackgroundImage != null)
{
this.BackgroundImage.Dispose();
}
this.BackgroundImage = (Image)this.bgImages.Clone();
}
}
Hier löschen wir das alte Bild und kopieren es. Da wir spiel locken sollte es auch kein problem mit der bmp geben.
Da wir hier direkt im Form-Thread arbeiten, sollte es auch vor Zugriffen von der Form gesichert sein :P (z.b. neues Rendern beim verändern der Fenster größe)