Hallo,
ich habe das folgende Problem: Er zeigt mir immer nur das Quit_3.png an.
Dabei möchte ich jede 500ms ein anderes Bild laden.
Die Variable zaehler ist als global deklariert und hat den Anfangswert 0.
private void button_Quit_Click(object sender, EventArgs e)
{
Timer t3 = new Timer();
t3.Interval = 500;
t3.Tick += new EventHandler(t3_Tick);
t3.Start();
}
public void t3_Tick(object sender, EventArgs e)
{
while (zaehler < 4)
{
zaehler++;
if (zaehler == 1)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_1.png");
}
if (zaehler == 2)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_2.png");
}
if (zaehler == 3)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_3.png");
}
}
}
Schätzungsweise geht es einfach zu schnell. Hau mal ein picturebox.Update und ne pause von ner halben sekunde nach jedem picturebox.Load rein.
Wenn ich nach jedem Bild eine MessageBox.Show(""); erstelle funktioniert das ganze aber sonst nicht
Deine while-Schleife blockiert den GUI Thread.
1.) [FAQ] Warum blockiert mein GUI?
2.) [Hinweis] Wie poste ich richtig? 1.1.1 und 6
Darth Maim
Jedoch kann ich das Fenster verschieben und minimieren bzw maximieren und es liegt auch keine Zeitüberschreitung(Programm reagiert nicht mehr) vor.
Der Fehler muss wo anderes liegen.
Das Programm wartet 0,5s und lädt dann das letzte Bild ohne die vorherigen Bilder geladen zu haben.
Hab den Code zu schnell überflogen.
Im Tick-Event wird der Zähler erhöht, ist damit 1 (ich gehe mal davon aus, dass der am Anfang 0 ist). Dadurch wird das erste Bild angezeigt. Da der Zähler aber immer noch kleiner 4 ist, wird die Schleife nochmal ausgeführt, der Zähler ist dann 2, das 2. Bild wird angezeigt und zwar gleich nachdem das erste Bild angezeigt wird. Und das ganze vier mal.
Du willst das ganze ohne while-Schleife, ungefähr so:
public void t3_Tick(object sender, EventArgs e) {
zaehler++;
if (zaehler == 1)
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_1.png");
else if (zaehler == 2)
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_2.png");
else if (zaehler == 3)
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_3.png");
}
Darth Maim
Ja super es funkt.
Deine Lösung hatte ich auch aber die while schleife dann in meinen private void button_Quit_Click(object sender, EventArgs e) und da hat er gemekert.
Vielen Dank noch mal 😃
Ach Mist zu früh gefreut.
Das ganze klapp nur bei einmaligen drücken vom Button auch wenn ich die variable zaehler in private void button_Quit_Click(object sender, EventArgs e) wieder 0
setze.
Nach dem zweiten Klicken geht er schneller durch. Wie kommt das?
private void button_Quit_Click(object sender, EventArgs e)
{
Timer t3 = new Timer();
t3.Interval = 500;
t3.Tick += new EventHandler(t3_Tick);
t3.Start();
zaehler = 0;
}
public void t3_Tick(object sender, EventArgs e)
{
zaehler++;
if (zaehler == 1)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_1.png");
}
if (zaehler == 2)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_2.png");
}
if (zaehler == 3)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_3.png");
}
if (zaehler == 4)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_4.png");
}
if (zaehler == 5)
{
pictureBox_quit.Load("C:\\Users\\Jaroprus\\Pictures\\Quit_5.png");
}
}
Der erste Timer existiert und läuft noch. Du erstellst dann einen 2. Timer, der das gleiche Event aufruft -> Das Event wird 2 mal alle 500ms aufgerufen.
Wie kann ich das unterbinden? Mit t3.Stop() oder t3.Enaabled= true klappt das Ganze an der stelle in
if(zaehler == 6)
nicht
Wenn ich also auf den Button drücke, erstelle ich einen Timer (t3). Drücke ich nochmals auf den Button erstelle einen weiteren Timer (t3). Dadurch durchläuft er die Schleife natürlich schneller richtig?
Ok mit
t3.Tick -= new EventHandler(t3_Tick);
klappt es nun aber wie kriege ich es hin das Ganze zu sperren, so das der Benutzer nur einmal auf den Button klicken kann und dann warten muss bis alle 5 Bilder geladen wurden und erst dann wieder die Möglichkeit besteht den Button zu betätigen?
es gibt mehrere Möglichkeiten, dein von Darth Maim angesprochenes Problem zu bewältigen.
Ich würde ja eher dazu raten, aus Timer t3 eine Membervariable der Form zu machen... dann ließe sich das u.U. Alles wie folgt regeln:
Timer t3 = null;
private void button_Quit_Click(object sender, EventArgs e)
{
if(t3 == null)
{
t3 = new Timer();
t3.Interval = 500;
t3.Tick += new EventHandler(t3_Tick);
}
zaehler = 0;
t3.Start();
button_Quit.Enabled = false;
}
public void t3_Tick(object sender, EventArgs e)
{
zaehler++;
pictureBox_quit.Load(string.Format("C:\\Users\\Jaroprus\\Pictures\\Quit_{0}.png", zaehler));
if(zaehler >= 5)
{
t3.Stop();
button_Quit.Enabled = true;
}
}
alternativ könntest du auch im button_Quit_Click Event Handler prüfen, ob t3.Enabled = true und den Klick in diesem Fall ignorieren, anstatt den Button gänzlich zu disablen... aber das ist wohl Geschmackssache 😃
Sicher, aller Anfang ist schwer. Trotzdem bewegen sich alle behandelten Teilprobleme auf den Niveau von [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und wären mit den hier vorausgesetzten Grundlagenkenntnissen leicht zu vermeiden bzw. leicht zu erkennen gewesen. Eine einzelne Frage dazu wäre ja noch ok gewesen, aber hier Nachfrage an Nachfrage zu reihen, sprengt den Rahmen. Bitte etwas mehr Eigeninitiative.