Entwickler-Ecke
Basistechnologien - Zeit messen?
German_Chiller - So 14.02.10 18:19
Titel: Zeit messen?
Ich wollte eine Simulation von einem Ball machen, der immer fällt, aufspringt, aufsteigt usw. bis er liegen bleibt.
Damit ich den die Fallstrecke berechnen kann, brauche ich eine Zeit, damit es realistisch aussieht und ich nicht jedes Mal an den Thread.Sleep(x) werten herumspielen muss
Gibt es so einen Befehl, der mir die Zeitspanne in Millisekunden ausgibt?
...
for (....)
{
//anfangszeitpunkt
//warten
//endzeitpunkt
//Zeitspanne
}
jaenicke - So 14.02.10 18:31
Hallo und :welcome: bei uns im Forum!
Dafür gibt es die Stoppuhr bei .NET, also Stopwatch.
Davon erstellst du dir eine Instanz, kannst diese dann starten und stoppen und in Elapsed sehen wieviel Zeit vergangen ist dazwischen.
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsed.aspx
Ist nur noch die Frage ob das für deinen Anwendungszweck genau genug ist.
German_Chiller - So 14.02.10 19:08
Ich hab es jetzt mal mit Stopwatch gemacht, aber der Punkt bewegt sich nicht so, wie er soll
Als Beispiel hab ich jetzt eine lineare Bewegung genommen. Der Punkt beschleunigt, dann stoppt er wieder ab, bis er steht, dann beschleunigt er wieder usw...
obwohl er sich eigentlich gleichförmig bewegen sollte. Ist die Zeit richtig gemessen?
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: 24: 25: 26: 27: 28: 29: 30: 31:
| private void button1_Click(object sender, EventArgs e) { Graphics Grafik; float hoehe = 0; float strecke = 0; float zeit = 0; Stopwatch stopWatch = new Stopwatch(); TimeSpan timeSpan; Grafik = this.CreateGraphics(); Grafik.FillEllipse(Brushes.Lime, 100, 0, 50, 50);
stopWatch.Start(); Thread.Sleep(100); while (hoehe < 500) { stopWatch.Stop(); timeSpan = stopWatch.Elapsed; zeit = timeSpan.Milliseconds;
strecke = 20 * (zeit / 1000); hoehe = hoehe + strecke; Refresh(); Grafik.FillEllipse(Brushes.Lime, 100, hoehe, 50, 50); stopWatch.Start(); Thread.Sleep(100); } } |
Moderiert von
Kha: C#-Tags hinzugefügt
jaenicke - So 14.02.10 19:13
Solange du die abgelaufene Zeit nicht resettest wird die neue Zeit jeweils addiert. ;-)
German_Chiller - So 14.02.10 19:17
kaum macht man es richtig, funktioniert es^^
danke für die schnelle hilfe...
German_Chiller - So 21.02.10 00:21
Mein Programm läuft jetzt, der Ball springt jetzt in meinem Fenster hin und her, aber er flackert ab und zu, obwohl ich Thread.Sleep(10) habe, also genug zeit bleiben sollte...
Wie kann ich das flimmern des Balls wegbekommen?
ThomAlex - So 21.02.10 03:27
Vielleicht solltest du DoubleBuffern, also im BackBuffer zeichnen und am Ende das Ergebnis in den Frontbuffer bringen. Setze die Eigenschaft Doublebuffered deiner Form auf true, dann könnte es gehn. MFG ThomAlex
edit: Falls das nicht klappt würde mich auch gerne mal interessieren, woran es liegt.
Christian S. - So 21.02.10 12:29
Ein Thread.Sleep(10) erscheint mir auch ein bisschen kurz zu sein. Es gibt da immer die Diskussion, welche Zeitabstände man unter Windows noch garantieren kann, aber 10 Millisekunden sind auf jeden Fall ziemlich kritisch. Das wären außerdem 100 Bilder pro Sekunde, was man wahrscheinlich nicht braucht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!