Wie genau können Reaktionszeiten des Benutzers gemessen werden?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie genau können Reaktionszeiten des Benutzers gemessen werden?

    Hallo,

    ich möchte einen Test entwickeln bei dem Reaktionszeiten des Benutzers in Millisekunden erfasst werden. Als Eingabegerät soll die Maus verwendet werden, wobei die Dauer einer Bewegung gemessen werden soll.

    Bei einer absolut fehlerfreien Messung würde man die wahre Reaktionszeit erhalten. Doch normalerweise hat jede Messung einen Messfehler. Ich möchte gerne wissen, wie groß dieser Messfehler ist?

    Ich habe gelesen, dass Windows kein richtiges Echtzeitbetriebssystem ist und Ereignisse in Zeitintervallen von 15,625 Millisekunden verarbeitet. Angenommen die wahre Reaktionszeit wäre 1000 Millisekunden, liegt der gemessene Wert dann zwischen 1000 und 1015,625 Millisekunden?

    Bei meinen Reaktionszeitmessungen verwende ich die Stopwatch-Funktion. Ist dies die beste Möglichkeit, Reaktionszeiten des Benutzers zu messen und gibt es weitere Möglichkeiten die Genauigkeit einer Reaktionszeitmessung zu verbessern (vielleicht auch durch eine bessere Maus)?

    LG

    Ansgar

    Public Sub Starte Reaktionszeitmessung()
    Cursor.Position = New Point(CInt(Me.Width / 2), CInt(Me.Height / 2))
    stopWatch.Reset()
    stopWatch.Start()
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    MouseScale = (MousePosition.Y / Screen.PrimaryScreen.Bounds.Height) * 1000
    If MouseScale > 951 Then
    stopWatch.Stop()
    TextBox2.Text &= Chr(9) & stopWatch.ElapsedMilliseconds
    End If
    End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ansgar“ ()

    Die Stopwatch ist schon die richtige Wahl, und die misst auch wesentlich genauer als 15,625 Millisekunden. Denn sofern unterstützt, verwendet die Stopwatch nicht den Systemzeitgeber, sondern einen direkt in der Hardware eingebauten, der bis auf Ticks (1 Tick = 1 Hundertstel einer Nanosekunde) genau misst. Natürlich ist die Genauigkeit trotzdem nicht ganz so hoch, da auf dem System immer noch andere Sachen gleichzeitig laufen, aber Millisekunden sind absolut kein Problem, da ist eher noch die Latenz der Maus größer.
    Achtung Tick ist nicht gleich Tick!
    ​Stopwatch -Ticks unterscheiden sich von DateTime.Ticks.
    Jeder Tick im DateTime.Ticks-Wert stellt ein Intervall von 100 Nanosekunden dar.
    Jeder Tick im ElapsedTicks-Wert stellt das Zeitintervall als 1 Sekunde geteilt durch die Frequency dar.
    Quelle: msdn.microsoft.com/de-de/libra…apsedticks(v=vs.110).aspx
    Bei der WinApi-Funktion GetTickCount ist ein Tick sogar 1ms.

    Alle Uhren ticken anders! ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    ansgar schrieb:

    VB.NET-Quellcode

    1. Handles Me.MouseMove
    ist da eher suboptimal.
    Beschreibe mal bitte den Test etwas genauer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für Eure Hinweise. Bei dem Test bzw. Training handelt es sich um einen sogenannten 'Approach-Avoidance Task' ('AAT'), wie er aktuell in der Psychologie häufig verwendet wird. Wichtigste Eigenschaft des 'AAT' ist, dass wenn ein Bild – z.B. mit Zigaretten – erscheint, die Maus weg geschoben werden soll und bei neutralen Bilder die Maus ran gezogen werden soll. Dabei ändert sich auch die Bildgröße: Beim Ranziehen wird das Bild größer und beim Wegschieben wird das Bild kleiner. Dies bedeutet, dass ich unbedingt die 'MousePosition.Y' für die Bildskalierung verarbeiten muss (siehe Quelltext).

    Diesem Training liegt folgende Beobachtung zugrunde: Im Lauf unseres Lebens haben wir unzählige Male schmackhafte Nahrung zum Mund geführt, geliebte Menschen zu uns herangezogen und interessante Dinge zur näheren Betrachtung vor die Augen geführt. Im Gegensatz dazu nehmen wir Abstand von Dingen, die uns langweilig oder eklig erscheinen. Auf diese Weise sind Bewegungen des Heranziehens oder Wegwerfens mit den Beurteilungen positiv oder negativ und wichtig oder unwichtig verbunden. Wenn nun jedoch gelernt wird, positiv und wichtig erlebte Dinge vom Körper weg zuschieben, so werden diese Dinge bei häufiger Übung negativ und unwichtig.

    Ich habe bislang einen 'AAT' therapeutisch gegen Nicotinsucht eingesetzt und es hat funktioniert: Die Teilnehmer des Trainings rauchten nachher weniger. Bei einem therapeutischen Einsatz ist die genaue Erfassung der Reaktionszeit unwichtig. Nun soll der 'AAT' aber eingesetzt werden, um zu bestimmen, wie positiv bzw. negativ bestimmte Bilder erlebt werden. Diese Bilder sollen daher sowohl ran gezogen also auch weg geschoben werden. Wenn ein Bild besonders schnell ran gezogen und besonders langsam weg geschoben wird, so geht man davon aus, dass eine besonders positive Einstellung zu diesem Bild besteht. Insofern ist hier eine möglichst genaue Erfassung der Reaktionszeit notwendig.

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    MouseScale = (MousePosition.Y / Screen.PrimaryScreen.Bounds.Height) * 1000
    If MouseScale < 50 And Rando > 10 And ClickBit = 0 Or MouseScale > 951 And Rando < 11 And ClickBit = 0 Then
    stopWatch.Stop()
    TextBox2.Text &= stopWatch.ElapsedMilliseconds
    ClickBit = 1
    Call Reporting()
    End If
    If ClickBit = 0 Then
    Call Action()
    End If
    End Sub

    Public Sub Action()

    MouseDelta075 = CInt(Math.Abs(MouseScale - 500) * 3 / 4 * 400 / 450)
    MouseDelta100 = CInt(Math.Abs(MouseScale - 500) * 650 / 450)

    If MouseScale < 500 And MouseScale > 49 And ClickBit = 0 Then
    NewsizeX = 650 - MouseDelta100
    NewsizeY = 300 - MouseDelta075
    NewsizeX = CInt(NewsizeX * Skala)
    NewsizeY = CInt(NewsizeY * Skala)
    PictureBox1.Size = New Size(NewsizeX, NewsizeY)
    Xpos = CInt(Me.Width / 2 - PictureBox1.Width / 2)
    Ypos = CInt(Me.Height / 2 - PictureBox1.Height / 2)
    PictureBox1.Location = New Point(Xpos, Ypos)
    End If
    If MouseScale >= 500 And MouseScale < 952 And ClickBit = 0 Then
    NewsizeX = 650 + MouseDelta100
    NewsizeY = 300 + MouseDelta075
    NewsizeX = CInt(NewsizeX * Skala)
    NewsizeY = CInt(NewsizeY * Skala)
    PictureBox1.Size = New Size(NewsizeX, NewsizeY)
    Xpos = CInt(Me.Width / 2 - PictureBox1.Width / 2)
    Ypos = CInt(Me.Height / 2 - PictureBox1.Height / 2)
    PictureBox1.Location = New Point(Xpos, Ypos)
    End If
    End Sub
    @ansgar das ist ein gutes Thema.
    Ich empfehle Dir, das ganze in disjunkte Teilprobleme zu zerlegen und jedes für sich in einem separaten kleinen Projekt zu bearbeiten.
    wenn alle Teilprobleme zu Deiner Zufriedenheit gelöst sind, pack sie in einem neuen Projekt zusammen.
    So hast Du den Beginn einer Sammlung von Snippets, die Du immer mal wieder gebrauchen kannst
    und
    Du kannst zu jedem Teilproblem in einem separaten Thead hier Hilfe bekommen. Die ist dann sehr spezifisch und somit sehr effizient. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!