Laden...

Verschieden Bilder nach einer gewissen Zeitdauer anzeigen

Erstellt von Jaroprus vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.105 Views
Thema geschlossen
J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren
Verschieden Bilder nach einer gewissen Zeitdauer anzeigen

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");
                }
             }
          }

U
189 Beiträge seit 2011
vor 11 Jahren

Schätzungsweise geht es einfach zu schnell. Hau mal ein picturebox.Update und ne pause von ner halben sekunde nach jedem picturebox.Load rein.

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

Wenn ich nach jedem Bild eine MessageBox.Show(""); erstelle funktioniert das ganze aber sonst nicht

D
216 Beiträge seit 2009
vor 11 Jahren

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

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

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.

D
216 Beiträge seit 2009
vor 11 Jahren

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

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

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 😃

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

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");
                                        
                }
}
D
216 Beiträge seit 2009
vor 11 Jahren

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.

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

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?

J
Jaroprus Themenstarter:in
7 Beiträge seit 2013
vor 11 Jahren

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?

S
269 Beiträge seit 2010
vor 11 Jahren

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 😃

Hinweis von herbivore vor 11 Jahren

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.

Thema geschlossen