Laden...

Hat die Logik mich verlassen?

7 Antworten
1,590 Aufrufe
Letzter Beitrag: vor 19 Jahren
Hat die Logik mich verlassen?

Graphics g = pictureBox1.CreateGraphics();
Random r = new Random();
Point[] punkte = new Point[100];
for (int i = 0; i < 100; i++)
{
    punkte[i] = new Point(i, r.Next(49));
}
while (true)
{
    for (int i = 1; i < 100; i++)
    {
        punkte[i - 1] = punkte[i];
    }
    punkte[99] = new Point(99, r.Next(49));
    g.Clear(Color.White);
    g.DrawLines(new Pen(Color.Black), punkte);
    Thread.Sleep(100);
}

Meiner Meinung nacht, sollten jetzt die ganzen Punkte von Rechts nach Links laufen, wie mans auch von Performanceanzeigen kennt. Aber Links verschwindet einfach immer ein Punkt bis keine mehr da sind.

Ich kanns mir nicht erklären

Was magst du denn genau machen ?

lg,
kakaomilch.

Du hast vergessen die x-Koordinate deiner Punkte anzupassen:

for (int i = 1; i < 100; i++)
{
    punkte[i].x--; // jeden Punkt um einen Pixel nach links verschieben

    punkte[i - 1] = punkte[i];
}

Hallo ZiMD,

mich wundert, dass da überhaupt was gezeichnet wird, da die while (true)-Schleife ja das GUI blockiert. Der Aufbau deines Programms entspricht der eines Konsolen-Programms. Das ist für Windows Forms echt falsch. Du solltest den Aufbau komplett anders gestalten:

Pack in das OnPaint/den Paint-EventHandler das reine Zeichnen (aus dem Array).

Pack den Code, der die Punkte (im Array) verschiebt, in den EventHandler eines Windows-Forms Timers und rufe als letztes in diesem EventHandler Invalidate auf.

Stell den Timer im Konstruktor des Forms auf 100ms. Thread.Sleep brauchst du dann gar nicht mehr.

herbivore

Hi herbivore,

das war ja jetzt nur ein Test um zu schauen wie sowas geht. Das hat nichts mit einem Programm zu tun. Edit: Aja es ist alles in nem Thread 😉

Danke #coder, deins hat super funktioniert! 🙂

ZiMD

Dein Code hinterlässt zudem ein MemoryLeak

Graphics muss Disposed werden.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

Hallo ZiMD,

es wurde hier schon mal diskutiert, ob es erlaubt ist, aus einem extra Thread zu zeichnen. Eigentlich ist der Zugriff auf Controls aus einem extra Thread heraus nicht erlaubt.

Hallo Programmierhans,

Dein Code hinterlässt zudem ein MemoryLeak. Graphics muss Disposed werden.

Wenn man ein Objekt nicht Disposed tut es (indirekt) der GC für einen (zumindest, wenn der Destruktor des Objekts korrekt implementiert ist). Es ist also kein echtes Leak, aber besser wäre es natürlich schon Dispose aufzurufen.

Hallo ZiMD,

im OnPaint müsstest du das Graphics-Objekt nicht disposen.

herbivore