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...
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
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...
Hallo hfb11,
vielleicht arbeitest du mal mit der DateTime-Klasse.
mit der ToString(...)-Methode kannst du auch dein Pattern angeben, wie du es formatieren magst.
Viele liebe Grüsse
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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...
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
Ok Danke 😃
Werde eure Tipps mal umsetzten.
Man kann niemanden überholen, wenn man nur in seinen Fußstapfen tritt...
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.
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
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 🙁
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
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...
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...
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
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...
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.
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...
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.
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.