C# Schleife für if-Anweisung

MuneWrecker

Cadet 3rd Year
Registriert
Apr. 2015
Beiträge
52
Hey,
ich experimentiere gerade bisschen mit c# in ner Windows Forms Anwendung und bin auf ein Problem gestoßen, worauf ich im Internet keine Antwort finden konnte:

Wenn ich eine Schleife in mein Programm einbaue, wird diese schon ausgeführt bevor sich das Fenster öffnet. Das Problem dabei ist, dass ich in meinem Programm einen Button habe, der diese Schleife unterbrechen soll...Die Folge ist also, dass sich das Programm garnicht erst öffnet sonder nur im Hintergrund die Schleife ausgeführt wird.

Hier mal ein Beispiel zu Veranschaulichung:

private void Form1_Load(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(1000); //<---- das bringt auch nix
for (int i = 0; i<100; i++ ) //<--- ich habe auch verschiedene schleifentypen probiert, die underschiedlich oft wiederholt wurden
{
textBox1.Text += "dkleshfkleshfgkljhgregh" +Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

textBox1.Text += "dkleshfkleshfgkljhgregh" + Environment.NewLine;

}
}



Bei diesem Beispiel öffnet sich das Programm nach einer Weile mit der vollgespammten Textbox. Ich habe auch mal Probiert zwischen jeden Befehl " System.Threading.Thread.Sleep(500);" zu schreiben, aber dann deuert es nur länger und es öffnet sich nach wie vor die vollgespammte Textbox.
 
Naja, du rufst die Schleife ja auch direkt auf sobald die Form geladen wird. So wie ich das verstehe darfst du es aber erst aufrufen nachdem die Form geladen wurde. Oder eben sobald man eine Taste drückt.
 
Dein Problem ist, dass du prozedural alles nacheinander ausführst.
Du musst den Button als erstes aufbauen und dann asynchron in einem eigenen Thread die schleife ausführen. Es gibt dann je nach gewünschter Funktion unterschiedliche Möglichkeiten die Iteration der Schleife abzubrechen. Z. B. Ein listener (=interface) in der schleife der gerufen wird bei klick vom button.
 
Die Schleife wird genau zu dem Zeitpunkt abgearbeitet an dem das Anwendungsfenster aufgebaut wird (Form_Load). Da die Schleife keine "Pause" drin hat in der der Fensteraufbau weitergemacht werden kann, siehst du auch das Anwendungsfenster nicht während die Schleife läuft. Der Fensteraufbau wird durch die Schleife blockiert.

In eine Schleife im Form_Load muss daher mindestens ein "Application.DoEvennts()" rein.
Beachte auch, dass wenn ein Fehler im Code von Form_Load auftritt, du keine Debuggermeldung bekommst. Fehler die dort auftreten werden verschluckt.

Vorschlag: Nimm die Schleife aus Form_Load raus. Mach einen Button und lass die Schleife in dessen Codeblock laufen. So ist 100% sichergestellt dass das Fenster mit Button aufgebaut wird und nichts blockiert.
Bei dieser Art Schleifenausführung auf dem Hauptthread der Anwendung sollte man in der Schleife mindestens einen Application.DoEvents() Aufruf haben, damit das Benutzerinterface nicht blockiert.
 
das ding ist, dass ich nicht so viel in den code block des buttons schreiben will, weil es erstens unübersichtlich wird und zweitens immer alles ausgeführt wird, was dort drinnen steht..
Ergänzung ()

eine art goto befehl könnte mein problem auch lösen, aber ich habe mir sagen lassen das goto befehle kacke sind
 
Application.DoEvents() ist so das schlechteste was man bei langen Rechenoperationen machen kann. Dafür gibt es Threads oder Tasks.

Naja eine Art GoTo sind Funktionen bzw. Methoden? Warum nicht die benutzen?
 
Ja, so ist das mit Code. Wenn man ihn hinschreibt, wird er auch ausgeführt...

Bezüglich Übersichtlichkeit: Dafür schreibt man Funktionen/Methoden. Lager den Code in eine aus.

Und Magie ist hier halt nicht. Das Programm wird exakt das tun, was du hineinschreibst. Nicht mehr und nicht weniger. Was ist denn überhaupt der tiefere Sinn hinter dem Button. Vielleicht kann man die besser helfen, wenn man deine Intention kennt.
 
ich wollte so ne art interaktive geschichte machen in der immer bisschen text kommt und dann der nutzer eine wahl hat was passieren soll. der button1 macht nichts anderes als einer variable den wert 1 zuzuweisen und der button2 macht das selbe nur halt mit 2.
und dann habe ich halt
if (variable == 1)
dann passiert was auch immer option 1 ist.
und das selbe mit zwei.
 
Ok, damit kann man ja schonmal arbeiten. Allerdings ist das mit C# und GUI erstmal kein Projekt für einen blutigen Anfänger (keine Unterstellung, aber du wirkst doch sehr unerfahren).

Daher meine Empfehlung an dich: Verleibe dir erstmal ein vollständiges Tutorial mit Beispielprojekten ein, um die Grundlagen zu lernen.

Dennoch ein paar Tipps für das Genannte: Du könntest dir eine Art binären Entscheidungsbaum bauen, den du dann mit den beiden Buttons durchläufst. Da du jedoch bisher nichtmal mit Funktionen/Methoden arbeiten kannst, dürfte das für den Anfang ein wenig zu schwierig sein.
 
bin auch ein anfänger ^^ . das ding ist dass ich mir schon paar sachen zu methoden, klassen und objekten angeschaut habe aber ich finde es halt ziemelich schwer das was ich in irgendeinem tutorial sehe auf mein eigenes problem anzuwenden.
und paar sachen habe ich auch schon programmiert:
-zoll in cm rechner
-Taschenrechner
-passwortabfrage (pw wird nur in ner textdatei gespeichert)
 
Zuletzt bearbeitet:
SomeDifferent schrieb:
Application.DoEvents() ist so das schlechteste was man bei langen Rechenoperationen machen kann. Dafür gibt es Threads oder Tasks.

Threads und Tasks sind aber nicht unbedingt was für Anfänger. DoEvents hingegen schon. Schnelle Lösung um wenigstens mal ein Resultat zu sehen und nicht frustriert den Rechner auszuschalten.
 
Wie gesagt, du wirst wohl um das ein oder andere Tutorial nicht rumkommen. Eventuell solltest du auch erstmal auf eine GUI verzichten und das Ganze als Konsolenanwendung umsetzen. Nachher kannst du immernoch eine GUI dazu bauen.
 
das mit der konsolenanwendung habe ich mir auch überlegt aber ich habe den eindruck dass das nicht viel einfacher ist, weil sich ja eigentlich nur die art des inputs ändert.
 
Ein großer Unterschied ist es nicht, aber eventuell hilft es dir, dich auf das wesentliche zu konzentrieren.
Das Hauptproblem wird sein, eine passende Datenstruktur für Text und Entscheidungen aufzubauen. Und da fehlen glaub einfach noch Grundlagen.
 
MuneWrecker schrieb:
ich wollte so ne art interaktive geschichte machen in der immer bisschen text kommt und dann der nutzer eine wahl hat was passieren soll. der button1 macht nichts anderes als einer variable den wert 1 zuzuweisen und der button2 macht das selbe nur halt mit 2.

Soll das so eine Art Frage-/Antworspielchen werden? Frage, 2 Antwortmöglichkeiten und 2 unterschiedliche Aktionen?

Wenn das alles schon feststeht, würde ich dir eine Textbox und zwei Buttons empfehlen.
Dazu dann 3 Listen die strings enthalten (List<string>) und einen globalen Zähler.

Zu Beginn jeder "Runde" wird der globale Zähler um 1 erhöht.
Die Textbox wird in jeder "Runde" mit einem Wert aus der Frageliste gefüllt (Zeile -> globaler Zähler).
Dann kann der Benutzer aus 2 Antwortmöglichkeiten wählen (Liste 2 und Liste 3, jeweilige Zeile = globaler Zähler).
Je nachdem welchen Button der User drückt kannst du dann die die eine oder andere Aktion ausführen.

@SomeDifferent: Ich würde auch sagen dass man erstmal wissen muss wozu dieser Codeblock überhaupt gut sein soll bevor man ihn versucht zu optimieren. Nachher bricht man sich einen ab und optimiert nur Unfug.
 
Zuletzt bearbeitet:
@DocWindows
Da hast du schon Recht. Nur wird aus dem "hier mal schnell was ausprobieren" häufig ein fertiges Ergebnis - "läuft ja, lass ich so". Und schwupps gewöhnt man sich gerade als Anfänger etwas an, was wirklich nach hinten los gehen kann.
Aber nun gut, ich denke das wird sonst zu viel OffTopic :D
 

Ähnliche Themen

Zurück
Oben