Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Stoppuhr: In Label per Timer die Sekunden füllen: Es wird nur jede zweite Sekunde angezeigt
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

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

beantworten | zitieren | melden

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

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 :D
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden


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;
                }
        }
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hfb11 am .
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2459
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

Ok Danke :)
Werde eure Tipps mal umsetzten.
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von hfb11
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?
Zitat von herbivore
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ujr am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

Ich habe es hinbekommen.
Aber fragt mich nicht warum :D

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 :D
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Zitat von hfb11
Aber fragt mich nicht warum :D

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.
private Nachricht | Beiträge des Benutzers
hfb11
myCSharp.de - Member



Dabei seit:
Beiträge: 21
Herkunft: Karlsruhe

Themenstarter:

beantworten | zitieren | melden

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

Aber Danke für die Hilfe :)
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Hallo,
Zitat von hfb11
Auf die Gefahr hin, wieder einen Rüffel zu bekommen, weil ich wieder irgendwas falsch gemacht habe, frag ich jetzt tortzdem mal nach. :D

Den kann man Dir aber leider nicht ersparen.
Zitat von hfb11
Vllt. kann mir ja hier einer helfen. Andere Foren sind an dem Problem gescheitert :D

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.
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (13.12.2011 - 11:29:28):

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.