Hey Leute,
in der Schule fangen wir grad mit GUI an.
Bisher haben wir nur Konsolenanwendungen programmiert.
Wir haben folgende Aufgabe bekommen:
Wir sollen einen Fortschrittsbalken einbinden, der wenn man auf "Start" klickt langsam "vollläuft".
DAs ist soweit auch kein Problem, nur man soll während des Ladevorgangs auch abbrechen können, also auf "Schließen" klicken und das Programm beendet sich.
Das ist aber nicht möglich so wie ich es gemacht habe:
private void btt_start_Click(object sender, EventArgs e)
{
btt_start.Enabled = false;
btt_reset.Enabled = false;
for (int i = 0; i < 101; i++)
{
bar.Value = i;
lbl_fortschritt.Text = i + " Prozent";
Thread.Sleep(50);
}
btt_start.Enabled = true;
btt_reset.Enabled = true;
}
private void btt_reset_Click(object sender, EventArgs e)
{
bar.Value = 0;
lbl_fortschritt.Text = "0 Prozent";
}
private void btt_close_Click(object sender, EventArgs e)
{
Application.Exit();
}
Liegt ja dadran das "Thread.Sleep" das ganze Programm "stoppt" und man während dessen auch nichts machen kann.
Was kann ich statt Thread.Sleep verwenden?
Gruß,
Matze
Auf der Seite bin ich auch schon gelandet. Kann damit aber nicht wirklich was anfangen, wie ich Aktionen auslager und all das.
Hab ich noch nie gemacht 😕
Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen.
Sauber, vielen Dank das geht 😄
Wenn ich jetzt noch wüsste wieso und was das Ding macht wär ich vollends zufrieden^^
Ich werd mal schauen ob ich das auch selbst rausfinde...
Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen. Dafür erntest du von mir gleich mal einen virtuellen Schlag auf den Hinterkopf 😃
Woher hast du diese Infos, das mit DoEvents() zu machen?
@ Matze91:
Der Weg geht über Thread/BackgroundWorker und dem Invoke auf die GUI, um die ProgressBar zu aktualisieren. Das sollte eigentlich alles in dem FAQ Artikel drin stehen. Schau bitte nochmal rein! [FAQ] Warum blockiert mein GUI?
Also Finger weg von Sleep und DoEvents.
Alternativ kannst du das auch mit einem Timer umsetzen, was aber an sich nicht viel Sinn macht.
Du kannst auch nochmal speziell nach "Thread Invoke GUI C#" googlen. Du solltest an nützlichen Informationen dann erschlagen werden.
> Codejunky <
Sry, aber ich kann mir das auch 20mal durchlesen und würde nur Bahnhof verstehen.
Das geht schon los bei einer so grundlegenden Frage wie "Was ist ein Thread", über "Was ist ein ThreadPool" bis hin zu "Was ist ein BackgroundWorker"...
Und das waren nur die Fragen die auftauchen wenn ich mir das durchlese was dort als "Lösung" steht...
Bitte keine Fullquotes - sind unnötig wenn die Antwort eh drüber steht 😉
Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 2.3
Ein Application.DoEvents() nach Thread.Sleep(x) sollte helfen.
Dafür erntest du von mir gleich mal einen virtuellen Schlag auf den Hinterkopf 😃
Woher hast du diese Infos, das mit DoEvents() zu machen?
Hallo,
Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich. So wird es z.B. im Galileo Open Book 2008 (ob es im 2010 auch noch so ist, weiss ich nicht) von Andreas Kühnel auch verwendet, weshalb man es als Anfänger durchaus als nützlich und gut ansehen kann, da es ja in so einem Buch als das vermittelt wird.
Hallo,
Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich.
Die Aussage alleine ist nicht sehr hilfreich - da hast du recht. Aber es sollte zum Nachdenken anregen und wenn die Forensuche danach bemüht wird kann festgestellt werden dass dieses Theme des öfteren ausführlich diskutiert wurde.
Von daher ist eine erneute Diskussion über Application.DoEvents nicht unbedingt notwendig. Dass es im OpenBook verwendet wurde ist halt so, aber trotzdem sollte es nicht verwendet werden denn es gibt richtigere Möglichkeiten wie zB die Verwendung von Threads.
Ausführlicher ist das auch in [FAQ] Warum blockiert mein GUI? nachzulesen.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich.
Such hier im Forum mal nach "reentrant" dann findest Du die Gründe wieso viele von uns das DoEvents so hassen.
Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Alternativ kannst du das auch mit einem Timer umsetzen, was aber an sich nicht viel Sinn macht.
Naja - für die Aufgabenstellung, einen Fortschrittsbalken, der langsam volläuft, zu schreiben, halte ich einen Timer für durchaus sinnvoll.
Lediglich den Sinn der Aufgabe an sich könnte man anzweifeln 😉
Lediglich den Sinn der Aufgabe an sich könnte man anzweifeln 😉
Weiß nicht ob das alle mitbekommen haben, aber wir haben heute erst das zweite mal überhaupt über sowas gesprochen, und da müssen die Aufgaben nicht unbedingt Sinn machen^^
Aber egal, ich lass es einfach, hierbei kommt eh nichts rum
Hallo,
Aber egal, ich lass es einfach, hierbei kommt eh nichts rum
Für deine Aufgabe finden sich im Forum mehrere Beispiele die zeigen wie es geht. Siehe zB [erledigt] ObjectDisposeException bei InvokeRequired abhandlung
Suchen macht schlau 😁
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hallo Matze91,
Ehrlich gesagt finde ich solche Antworten (die man öfters hier im Forum lesen kann) wie z.B. "Application.DoEvents() ist schlecht..." nicht sehr hilfreich. So wird es z.B. im Galileo Open Book 2008 (ob es im 2010 auch noch so ist, weiss ich nicht) von Andreas Kühnel auch verwendet, weshalb man es als Anfänger durchaus als nützlich und gut ansehen kann, da es ja in so einem Buch als das vermittelt wird.
Ich hab das Buch ( 2008 ) auch hier stehen und am anfang damit die ersten Schritte unter C# gelernt. Ich kann das Buch durchaus immer einem Anfänger an die Hand legen, da man damit sehr gut voran kommt. Doch wenn ich nun, nachdem ich schon ein bisschen weiter bin als das Wissen was aus dem Buch stammt, darin etwas nachlesen will, stelle ich immer wieder fest, das auch dieses Buch schwachstellen besitzt und teilweise nicht tief genug die Materie vermittelt.
Deshalb mein Tip. Wenn Dir hier im Forum einer einen Tip gibt, das man etwas anders machen soll, als es in Büchern steht, dann sollte man sich auch mal aus dem Buchfenster lehnen und nach diesem Weg sich orientieren und vor allem Informieren.
Meistens wirst Du dann schnell feststellen, das wirklich bessere und manchmal auch einfachere Wege gibt, als das was in dem Buch steht.
Das sind nur meine Erfahrungen, die ich mit diesem Buch gemacht habe.
Ich habe mir die Tips aus dem Forum immer zu herzen genommen, und habe dadurch stellenweise ein viel tieferes Wissen erlangt, als durch das reine Buch.
Grüße Stephan
Hallo Matze91,
wenn dein Lehrer eine Lösung für eine solche Aufgabe erwartet, dann ist davon auszugehen, dass ihr im Unterricht alles besprochen habt, was zur Lösung der Aufgabe erforderlich ist. Wenn ihr Threading noch nicht besprochen habt, ist es unwahrscheinlich, dass dein Lehrer eine Lösung mit Threading will, obwohl es bei langlaufenden Aktionen natürlich die einzig richtige und robuste Lösung ist und DoEvents nur eine Krücke, die man möglichst schnell wieder vergessen sollte. Aber beim Lernen muss man manchmal auch Umwege machen, nämlich genau dann, wenn noch nicht alle Hilfsmittel im Unterricht besprochen wurden.
Aber selbst wenn dein Lehrer eine Lösung mit Threading erwartet, ist ein Forum der falsche Ort, um dir solche grundlegenden Begriffe zu erklären. Dafür gibt es Bücher. Es ist nicht böse gemeint, wenn ich dir für diesen Fall den dringenden Rat gebe, bitte dort nachzuschauen.
Bitte beachte bei weiteren Fragen unbedingt [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
Siehe auch [FAQ] Wie finde ich den Einstieg in C#?
herbivore
PS: Am Thread.Sleep liegt es übrigens nicht, dass dein GUI bloickiert, sondern daran, dass die langlaufende Aktion komplett im GUI-Thread läuft. Wenn du das Thread.Sleep aus der Schleife entfernen würdest und im Gegenzug die Schleife öfter durchlaufen würdest, so das sie im Ergebnis genauso lange läuft wie bisher, würde das GUI auch ganz ohne Thread.Sleep blockieren.