| 

.NET C# Java Javascript Exception

0
Ich suche eine Funktion in Silverlight, die Uhrzeit mit hoher Auflösung erfragen zu können.

DateTime.Now liefert leider nur eine Auflösung von ca. 16ms.

Bisheriges Googlen brachte im Wesentlichen nur zwei divergierende Meinungen an's Licht:

  • Es geht aus prinzipiellen Gründen nicht.
  • Storyboard.GetCurrentTime sei die Lösung.


Aber die Storyboard-Idee funktioniert bei mir überhaupt nicht, der Aufruf liefert weniger als 10mal in der Sekunde einen neuen Wert. Irgendeine Idee, was ich falsch mache? Ein funktionierendes Code-Snippet?

Was auch nicht geht: System.Threading.Timer mit sehr hohen Wiederholraten.
News:
17.09.2009
pjacobi 1,1k 2 6
1 Antwort
1
Das hier als Class verkapselt und den Tick event abonnieren.
Dazu noch Code mit DateTime und TimeSpan zum auslösen des Tick events.
Ist ungetestet, also: Klappt das? :)

public delegate void TickDelegate();
public event TickDelegate Tick;
private Thread _timer;
private void start()
{
_timer = new Thread( new ThreadStart(TimerThread) );
}

private void TimerThread()
{
int interval_in_ms = 1;
while(true)
{
Thread.Sleep( interval_in_ms );
if( doTick && Tick != null )
Tick();
}
}


EDIT: Hab den Code mal geändert, so dass Tick alle X ms ausgelöst wird.
Du musst aber darauf achten, dass Dein Code im Tick-Handler auch Zeit verbaucht.
Das Polling-Interval ist also
interval_in_ms + <Zeit für code in TimerThread> + <Zeit für code in allen Tick-handlern>

Genauere Berechnungen mit DateTime un TimeSpan sind auch möglich:
DateTime last = DateTime.Now;
TimeSpan interval = new TimeSpan(0, 0, 0, 0, 10); // 10ms
last = last.Add(interval);
bool doTick = last > DateTime.Now;
17.09.2009
DaSpors 3,4k 1 8
DaSpors 3,4k 1 8
Ich sehe überhaupt nicht, woher ich bei dieser Methode die Zeit bekommen soll (außer wiederum mit dem ungenauen DateTime.now).

Ich möchte meinen Code nicht öfter als 60 mal per Sekunde aufrufen, sondernich muss Zeiten mit einer größeren Genauigkeit als 1/60 Sekunde messen.
pjacobi 17.09.2009
Beitrag geändert...besser? :)
DaSpors 18.09.2009
Danke, ich werde Thread.Sleep probieren.

Aber das Problem mit DateTime.Now hast Du noch nicht erfasst: Der Datentyp kann genauere Zeiten repräsentieren und damit rechnen aber *unter Silverlight* ist die Now Property auf 1/60 Sekunden quantisiert.

Die Differenz zweier Aufrufe von Now kann 16ms oder 33ms sein, aber nie 18ms oder 30ms!
pjacobi 18.09.2009
achso...nu hab ichs kapiert ;)
aber leider keine lösung parat :(
DaSpors 18.09.2009

Stelle deine .net-Frage jetzt!