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();
            //Ausgangsposition
            Grafik.FillEllipse(Brushes.Lime, 10005050);

            stopWatch.Start();
            Thread.Sleep(100);
            //Solange er nicht am unteren Rand vom Fenster ist
            while (hoehe < 500)
            {
                stopWatch.Stop();
                timeSpan = stopWatch.Elapsed;
                zeit = timeSpan.Milliseconds;

                //v = 20 Pixel pro Sekunde
                strecke = 20 * (zeit / 1000);
                hoehe = hoehe + strecke;
                Refresh();
                Grafik.FillEllipse(Brushes.Lime, 100, hoehe, 5050);
                stopWatch.Start();
                //Warten
                Thread.Sleep(100);
            }
        }


Moderiert von user profile iconKha: 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.