Autor Beitrag
Runner1994
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 29.12.11 14:52 
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:
ausblenden 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)   // alle 60min wird Stunde um 1 gesenkt und Minute auf 59 gesetzt
                {
                    iStunderest--;
                    iMinuterest = 59;
                }

                if (iSekunderest == 0)  // alle 60sec wird Minute um 1 gesenkt und Sekunde auf 59 gesetzt
                {
                    iMinuterest--;
                    Thread.Sleep(1000);
                    iSekunderest = 59;
                }
                
                textBoxsec.Text = iSekunderest.ToString();
                textBoxmin.Text = iMinuterest.ToString();
                textBoxStunde.Text = iStunderest.ToString();

                iSekunderest--;
            }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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.

_________________
Delphi: XE - OS: Windows 7 Professional x64
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
ausblenden 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:
            // Bsp-Rechnung:
            iStundeNow = DateTime.Now.Hour;         // iStundenow = 15;
            iMinuteNow = DateTime.Now.Minute;       // iMinutenow = 45;
            iSekundeNow = DateTime.Now.Second;      // iSekundenow = 10; -->15:49.10 Uhr
                // iZahl = 20 , RadioButtonSekunde ausgewählt
            iStundeende = iStundeNow + iStunderest;     // iStundeende = 15 + 0;
            iMinuteende = iMinuteNow + iMinuterest;     // iMinuteende = 45 + 0;
            iSekundeende = iSekundeNow + iSekunderest;  // iSekundeende = 10 + 20; --> 15:49.30 Uhr

            while (iStundeDif != 0 && iMinuteDif != 0 && iSekundeDif != 0)
            {
                iStundeNow = DateTime.Now.Hour;     // aktuelle Zeit einlesen
                iMinuteNow = DateTime.Now.Minute;
                iSekundeNow = DateTime.Now.Second;

                iStundeDif = iStundeende - iStundeNow;  // iStundeDif = 15 - 15 = 0;
                iMinuteDif = iMinuteende - iMinuteNow;  // iMinuteDif = 45 - 45 = 0;
                iSekundeDif = iSekundeende - iSekundeNow; // // iSekundeDif = 30 - 11 = 19;

                textBoxsec.Text = iSekundeDif.ToString(); // 0
                textBoxmin.Text = iMinuteDif.ToString(); // 0
                textBoxStunde.Text = iStundeDif.ToString();  // 19
            }


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 29.12.11 16:20 
ich habe mein gesamtes Programm mal auf megaupload hochgeladen:

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
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4803
Erhaltene Danke: 1060

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 29.12.11 16:32 
Hallo Runner1994,

die Timer-Komponente findest du z.B. unter openbook.galileocomp...70da0568dc2968abd117 erklärt.

Und bzgl. Thread.Sleep schau dir meinen Kommentar (sowie die Links) bei www.c-sharp-forum.de....php?p=656564#656564 an.
Runner1994 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 ( www.megaupload.com/?d=VGNW8XRH ) und mir bei der Fehlerbehebung zu helfen.

Gruß Runner
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 29.12.11 16:55 
user profile iconRunner1994 hat folgendes geschrieben Zum zitierten Posting springen:
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. Es so zu machen ist aber wirklich keine sinnvolle Lösung.