Entwickler-Ecke
WinForms - Sleep in einer Schleife?
Runner1994 - Do 29.12.11 14:52
Titel: Sleep in einer Schleife?
hi zusammen, ich versuche gerade einen Timer zu realisieren, bei welchem die Stunden, Minuten und Sekunden in einer eigenen Textbox eingetragen werden, aber das Programm funktioniert nicht. Kann mir bitte einer sagen was falsch ist und was ich ändern muss?
Hier mein Quelltext:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| while (!(iSekunderest != 0 && iMinuterest != 0 && iStunderest != 0)) { Thread.Sleep(1000);
if (iMinuterest == 0) { iStunderest--; iMinuterest = 59; }
if (iSekunderest == 0) { iMinuterest--; Thread.Sleep(1000); iSekunderest = 59; } textBoxsec.Text = iSekunderest.ToString(); textBoxmin.Text = iMinuterest.ToString(); textBoxStunde.Text = iStunderest.ToString();
iSekunderest--; } |
Moderiert von
Th69: C#-Tags hinzugefügt
Horschdware - Do 29.12.11 15:01
Ich bin C#'ler, aber ich würde sagen, dass du hier das typische Prolem hast, dass deine Verarbeitung läuft und läuft und erst ganz am Ende ein Neuzeichnen des Formulars ausgelöst wird, wodurch nur die letzte Ausgabe (alle Zähler auf null) zu sehen ist.
Insgesamt würde ich aber an diese Problemstellung anders herangehen, da die Variante mit Sleep() nicht genau ist, d.h. du kannst dir nicht sicher sein, ob nun wirklich eine Sekunde oder 1 Sekunde und x Hundertstel gewartet wurde.
Genauer wäre es, beim Start der Verarbeitung anhand des momentanen Zeitstempels + vom User eingegebene Zeitdifferenz eine Zielzeit in der Zukunft zu bestimmen und dann in der Schleife ständig mit der jeweils aktuellen Zeit zu vergleichen.
jaenicke - Do 29.12.11 15:10
Schreibe einfach nicht nur etwas von einem Timer, sondern nutze auch die gleichnamige Komponente (in der Toolbox unter Komponenten) in deinem Programm. Dann hast du das Problem nicht und sehr viel sauberer ist es auch. ;-)
Außerdem ist es viel einfacher, weil du dir die ganzen Schleifen usw. sparst.
Runner1994 - Do 29.12.11 16:07
danke für eure Antworten.
Daraufhin habe ich den Code umgeschrieben, aber es klappt noch immer nicht.
Was ist dieses mal falsch. Ich hoffe ihr kommt mit den Kommentaren klar, in welchen ich eine Beispielrechnung simuliere.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| iStundeNow = DateTime.Now.Hour; iMinuteNow = DateTime.Now.Minute; iSekundeNow = DateTime.Now.Second; iStundeende = iStundeNow + iStunderest; iMinuteende = iMinuteNow + iMinuterest; iSekundeende = iSekundeNow + iSekunderest; while (iStundeDif != 0 && iMinuteDif != 0 && iSekundeDif != 0) { iStundeNow = DateTime.Now.Hour; iMinuteNow = DateTime.Now.Minute; iSekundeNow = DateTime.Now.Second;
iStundeDif = iStundeende - iStundeNow; iMinuteDif = iMinuteende - iMinuteNow; iSekundeDif = iSekundeende - iSekundeNow; textBoxsec.Text = iSekundeDif.ToString(); textBoxmin.Text = iMinuteDif.ToString(); textBoxStunde.Text = iStundeDif.ToString(); } |
Moderiert von
Th69: C#-Tags hinzugefügt
jaenicke - Do 29.12.11 16:09
Wenn du in einem Timer bist, brauchst du keine Schleife mehr. Auf den ersten Blick sieht es so aus als ob es dann schon klappen könnte.
Runner1994 - Do 29.12.11 16:11
hi jaenicke, ich bin mir nicht danz sicher, was du damit meinst.
Kannst du es i-wie veranschaulichen. Am einfachsten für mich wäre, wenn du meinen Code umschreiben würdest.
Runner1994 - Do 29.12.11 16:20
ich habe mein gesamtes Programm mal auf megaupload hochgeladen:
http://www.megaupload.com/?d=VGNW8XRH
dann kannst du dir einen besseren Überblick schaffen und auch mal testen.
Ich gebe zu, dass das Programm vermutlich noch einige Schönheitfehler enthält. Die kommen zustande, da ich erst vor 3 Tagen mit Win Forms begonnen habe. Auch über diese Koreekturen würde ich mich freuen.
Gruß Runner
Runner1994 - Do 29.12.11 16:38
hey Th69,
danke für deine Antwort. Ich habe auch schon gesehn, dass bereits von C# bestimmte Befehle für Timer vorgegeben werden, aber mein Ziel war es, einen eigenen Timer zu erstellen, unabhängig von den gegebenen Möglichkeiten.
Vlt hättest du ja auch Lust einen Blick auf mein Programm zu werfen (
http://www.megaupload.com/?d=VGNW8XRH ) und mir bei der Fehlerbehebung zu helfen.
Gruß Runner
jaenicke - Do 29.12.11 16:55
Runner1994 hat folgendes geschrieben : |
| danke für deine Antwort. Ich habe auch schon gesehn, dass bereits von C# bestimmte Befehle für Timer vorgegeben werden, aber mein Ziel war es, einen eigenen Timer zu erstellen, unabhängig von den gegebenen Möglichkeiten. |
Windows ist ereignis- bzw. nachrichtenbasiert. Dort jetzt mit Polling etwas zu basteln, das über einen Timer tausendmal besser geht, ist irgendwie von hinten durch die Brust ins Auge... Warum der Aufwand für eine deutlich schlechtere Lösung?
Wenn du unbedingt über eine Schleife gehen willst, musst du zwischendurch dafür sorgen, dass die Nachrichten zum Neuzeichnen der Elemente auch abgearbeitet werden können. Das geht mit
Application.DoEvents [
http://msdn.microsoft.com/de-de/library/system.windows.forms.application.doevents.aspx]. Es so zu machen ist aber wirklich keine sinnvolle Lösung.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!