Laden...

Stoppuhr: In Label per Timer die Sekunden füllen: Es wird nur jede zweite Sekunde angezeigt

Erstellt von hfb11 vor 12 Jahren Letzter Beitrag vor 12 Jahren 9.929 Views
Thema geschlossen
H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren
Stoppuhr: In Label per Timer die Sekunden füllen: Es wird nur jede zweite Sekunde angezeigt

Auf die Gefahr hin, wieder einen Rüffel zu bekommen, weil ich wieder irgendwas falsch gemacht habe, frag ich jetzt tortzdem mal nach. 😄

Gleich vorneweg, ich habe gegoogelt und die Forensuche bemüht, jedoch nichts passendes bzw. nichts funktionierendes gefunden

Mein Ziel: kleine Stoppuhr (ohne Stopwatch-Klasse, nur mit Timer).

Eigentlich funktioniert alles Prima: Sekunden werden richtig gezählt, Minuten und Stunden auch. Jedoch Updated das Label für die Sekunden nicht richtig.

Das Label überspringt immer eine Zahl: also steht da --- 2, 4, 6, 8 ...
Wenn man eine MessageBox einbaut und sich die Zahlen ausgibt, zählt es richtig.

Habe schon einiges versucht, Refresh und Update von dem Label oder der ganzen GUI bringt auch nichts!

Vllt. kann mir ja hier einer helfen. Andere Foren sind an dem Problem gescheitert 😄

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

1.002 Beiträge seit 2007
vor 12 Jahren

Hallo hfb11,

poste doch mal den relevanten Quellcode, in dem du das Label aktualisierst. Rein durch deine Beschreibung ist es schwer, dir zu helfen.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

int i = 1; m = 0, s = 0;
sekunden.Interval = 1000;
private void sekunden_Tick(object sender, EventArgs e)
        {
            
                lblSekunden.Text = i.ToString();
                i++;
                lblSekunden.Refresh();

                if (i == 60)
                {
                    m++;
                    lblMinuten.Text = m.ToString();
                    i = 0;
                }
                if (m == 60)
                {
                    s++;
                    lblStunden.Text = s.ToString();
                    m = 0;
                }
        }

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

2.207 Beiträge seit 2011
vor 12 Jahren

Hallo hfb11,

vielleicht arbeitest du mal mit der DateTime-Klasse.

MSDN Datetime

mit der ToString(...)-Methode kannst du auch dein Pattern angeben, wie du es formatieren magst.

Viele liebe Grüsse

Coffeebean

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Ok danke 😃
Aber mich würde interessieren, warum es so wie ich mache nicht funktioniert 😕

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo hfb11,

also bei mir wird das Label jede Sekunde aktualisiert. Allerdings kannst du dich nicht darauf verlassen, dass der Timer exakt nach einer Sekunde tickt. Es kann kleine Abweichungen geben, die sich so summieren können, dass zwischendurch immer wieder mal eine Sekunde übersprungen wird. Du solltest den Timer also öfter ticken lassen (mindestens zwei mal pro Sekunde und dann per DateTime oder Stopwatch nachgucken, wie spät es wirklich ist und die Label entsprechend aktualisieren.

In deinem Code sind eh noch Fehler, z.B. würden nach einer Stunde die Anzeige kurz auf eine Stunde und 60 Minuten springen, bevor sie in der nächsten Sekunde auf die korrekten eine Stunde 0 Minuten springt. Wenn du die Zeit per Modulo berechnest, musst du erst alle Berechnungen bis zum Ende durchführen und erst dann die Label setzen.

herbivore

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Ok Danke 😃
Werde eure Tipps mal umsetzten.

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

U
1.688 Beiträge seit 2007
vor 12 Jahren

Aber mich würde interessieren, warum es so wie ich mache nicht funktioniert

Es liegt zumindest nicht am geposteten Quellcode. Hast Du vielleicht das Timer-Ereignis 2x abonniert?

Es kann kleine Abweichungen geben, die sich so summieren können, dass zwischendurch immer wieder mal eine Sekunde übersprungen wird

War auch mein erster Gedanke - allerdings zeigt die Implementierung einen einfachen Zähler, der das Problem nicht haben kann.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo ujr,

ok, das war ein bisschen missverständlich ausgedrückt. Ich meine, dass eine Sekunde der Realzeit übersprungen werden kann. Also dass der Zähler bei schon bei 59 Sekunden ist oder erst bei 57 Sekunden, obwohl real 58 Sekunden vergangen sind.

herbivore

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Evtl. kommt der Refresh immer genau vor dem umspringen der ungeraden Sekunden und durch die Aktualisierungen etc. bei den geraden Sekunden kurz danach (also z.B. 0.99, 2.01, 2.99, 4.01, ...). Zur Gewissheit vielleicht einfach mal die Sekunden UND Millisekunden auf die Console schreiben.

Ansonsten wie herbivore bereits schrieb, einfach den Timer öfter das Event feuern lassen und anhand der Sekunden prüfen, ob sich was geändert hat.

Nobody is perfect. I'm sad, i'm not nobody 🙁

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo tom-essen,

das Refresh ist unnötig und steht vermutlich nur aus Verzweiflung im Code. Das Label aktualisiert sich nach der Änderung des Textes von alleine (außer das GUI ist blockiert, [FAQ] Warum blockiert mein GUI?)

herbivore

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Das mit der Ungenauigkeit der Stoppuhr ist ja erst mal zweitrangig. Da kann man sich drum kümmern, wenn die fukcing Sekundenanzeige richtig funktioniert 😕

Ich habe den Sekunden-Timer auch schon auf 5 Sekunden hochgestellt und trotzdem überspringt er immer jede zweite Zahl. Ich werde einfach nicht mehr schlau daraus.

Werde es wohl oder übel mit anderen Methoden versuchen müssen.

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Ich habe es hinbekommen.
Aber fragt mich nicht warum 😄

Oben im Konstruktor habe ich den EventHandler erstelle:

sekunden.Tick += new System.EventHandler(sekunden_Tick);

Ich habe den jetzt mal auskommentiert und schon funktionierts.

Viel lernen ich noch muss. Junger Padawan 😄

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

1.002 Beiträge seit 2007
vor 12 Jahren

Hallo hfb11,

ich habe nicht den Eindruck, dass du dir genau durchgelesen hast, was schon einige Mitglieder vor mir geschrieben haben. Du sollst den Timer **häufiger **aufrufen, d.h. mehrfach pro Sekunde, nicht seltener. Die Ungenauigkeit der Timer-Klasse spielt dafür sehr wohl eine Rolle.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Natürlich habe ich mir das durchgelesen, aber für mich war in erster Linie wichtig, dass das Label richtig aktualisiert. Die Genauigkeit, ist mir erst mal nicht so wichtig. Ist ja nur ein Übungsprojekt.

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

U
1.688 Beiträge seit 2007
vor 12 Jahren

Aber fragt mich nicht warum 😄

Hab ich doch oben schon geschrieben. Wenn Du das Setzen des Eventhandlers auskommentierst und er wird immer noch aufgerufen ist es doch offensichtlich, dass er 2x abonniert ist, höchstwahrscheinlich also schon durch den Designer.

H
hfb11 Themenstarter:in
21 Beiträge seit 2011
vor 12 Jahren

Ich Depp. Klar.
Wie man sicher merkt bin ich neu in der Materie C# 😛

Aber Danke für die Hilfe 😃

Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

Auf die Gefahr hin, wieder einen Rüffel zu bekommen, weil ich wieder irgendwas falsch gemacht habe, frag ich jetzt tortzdem mal nach. 😄

Den kann man Dir aber leider nicht ersparen.

Vllt. kann mir ja hier einer helfen. Andere Foren sind an dem Problem gescheitert 😄

Was heißt denn "Foren"? Und Deine Anfrage von gestern unter
http://forum.chip.de/c-net/timer-label-1586851.html
fällt klar unter [Hinweis] Wie poste ich richtig? 2.2 - das ist echt ärgerlich.

Hinweis von herbivore vor 12 Jahren

In dem Fall sieht man gut, wie das doppelte Posten zu unnötiger Doppelarbeit führt. Einige Hinweise wurden in beiden Threads gegeben. Bitte nutze die Hilfsbereitschaft von kostenlosen Communities nicht aus. Du hattest in dem anderen Thread zwar noch keine abschließende Antwort bekommen, aber der Thread war ja noch in vollem Ganze. Von gescheitert keine Spur. Du hattest heute um 07:43 nochmal in dem anderen Forum nachfragt und dann schon um 08:22 bei uns gefragt und damit zwei Foren zeitlich mit dem Problem beschäftigt. So bitte nicht.

Thema geschlossen