Hallo, ist meine erste Frage hier. Hoffe ich habe alles richtig gemacht. Gegoogelt und hier gesucht hab ich auch! Keine passende Antwort dabei.
Habe grad ein Pokerspiel mit Visual Studio 2019 erstellt. Funktioniert auch alles wunderbar. Die Karten werden per Zufall ermittelt, in ein Array geschrieben und angezeigt.
private void CmdAusteilen_Click(object sender, EventArgs e)
{
string Bildname1 = "Bild" + c[1];
PicBoxMeine1.Image = (Bitmap)Properties.Resources.ResourceManager.GetObject(Bildname1);
string Bildname2 = "Bild" + c[2];
PicBoxMeine2.Image = (Bitmap)Properties.Resources.ResourceManager.GetObject(Bildname2);
.
.
.
}
Aber die Karten werden alle auf einmal angezeigt. Nun habe ich mir gedacht: Wäre doch schön wenn er die erste Karte hinlegt, Zeitgleich einen kleinen Sound abspielt (Kartengebegeräusch, 350 Millisekunden), bisschen Pause, Die zweite Karte mit Sound, bisschen Pause usw. usw.
Wenn ich das aber so mache wie unten passiert folgendes: Er spielt den Sound ab, wartet 2 Sekunden, spielt dann nochmal den Sound ab, wartet wieder 2 Sekunden usw. Und wenn er damit fertig ist dann legt er wieder alle Karten auf einmal hin. So soll es ja nun nicht sein 😉
private void CmdAusteilen_Click(object sender, EventArgs e)
{
string Bildname1 = "Bild" + c[1];
PicBoxMeine1.Image = (Bitmap)Properties.Resources.ResourceManager.GetObject(Bildname1);
meineWav.Play();
Thread.Sleep(2000);
string Bildname2 = "Bild" + c[2];
PicBoxMeine2.Image = (Bitmap)Properties.Resources.ResourceManager.GetObject(Bildname2);
meineWav.Play();
Thread.Sleep(2000);
.
.
.
}
Wie könnte ich es machen das er Karte hinlegt, Sound abspielt und dann die Pause macht??
Hallo und willkommen,
lies mal [FAQ] Warum blockiert mein GUI?
Eine mögliche Lösung ist mittels asynchroner Programmierung, d.h. statt Thread.Sleep
benutzt man Task.Delay
:
private async void CmdAusteilen_Click(object sender, EventArgs e) // beachte "async" hinzuschreiben!
{
// ...
await Task.Delay(2000);
// ...
}
Evtl. mußt du dann noch zusätzlich (vor dem Task.Delay
) für deine PictureBoxen Refresh()
bzw. Update()
aufrufen, damit die Anzeige sofort aktualisiert wird.