AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parallelport-Abfrage mit Timeout

Ein Thema von valjah · begonnen am 26. Mär 2009 · letzter Beitrag vom 28. Mär 2009
 
valjah

Registriert seit: 13. Nov 2006
19 Beiträge
 
Delphi 7 Personal
 
#7

Re: Parallelport-Abfrage mit Timeout

  Alt 26. Mär 2009, 19:28
Also, damit Ihr wisst, worum es überhaupt geht: mit dem Programm soll ein Experiment zur Reaktionszeitmessung umgesetzt werden. Die Reaktion (durch die Versuchsperson) erfolgt dabei über ein externes Gerät am Parallelport. Entscheidend ist dabei, die Zeit zwischen Beginn der Abfrage und der Reaktion (signalisiert durch eine Veränderung im Statusregister des Parallelports) möglichst genau zu bestimmen, d.h. mit einer hohen Auflösung (1 ms) und einer hohen Zuverlässigkeit (unabhängig von Störeinflüssen).
Das Windows sowas grundsätzlich nicht zulässt, ist mir schon bekannt. Dennoch versuche ich, die bestmögliche Lösung unter diesen Umständen zu finden. Das System darf während der Zeitmessung komplett lahmgelegt werden, die Versuchsteilnehmer sollen sich ja nicht mit anderen Programmen beschäftigen.

Zitat:
GetTickCount gibt dir auch die Zeit auf die Millisekunde genau.
GetTickCount ist nur auf etwa 10 ms genau, wie u.a. hier nachzulesen ist. Daher ist QPC die bessere Lösung.

Meine Frage war, wie lange ein (!) Durchlauf der repeat Schleife dauert und ob diese Zeit immer gleich ist. Ich habe das jetzt mal so getestet:
Delphi-Quellcode:
procedure WaitLPT;
begin
  QueryPerformanceFrequency(Frequency);
  QueryPerformanceCounter(StartTime);
  repeat
    WaitTimeOld := WaitTime; // Letzte Runde
    GetState := Inp32($379);
    CheckFlag(GetState, Buffer, BufferFull);
    QueryPerformanceCounter(StopTime);
    WaitTime := (StopTime - StartTime) * 1000 div Frequency;
    inc(i);
    if i > 100000 then break; // Nach 100.000 Runden -> raus
    LoopTime[i] := WaitTime - WaitTimeOld; // Aktuelle Rundenzeit
  until BufferFull or WaitTime >= TimeOut;
end;
Das Array (LoopTime) habe ich dann noch in ein Textfile geschrieben. Dort stehen nur Nullen. Demnach gehe ich davon aus, dass jede Runde weniger als 1 ms gedauert hat. Das ist schon mal gut.
Dann habe ich mir noch die Gesamtzeit angeguckt, die das Programm für die 100.000 Schleifendurchläufe braucht. Die variierte bei meinen Tests zwischen 199 und 312 ms. Das ist eher schlecht. Woran könnte das liegen? Aber solange die Auflösung unter 1 ms bleibt, kann es mir vermutlich egal sein...

Gruß, Valentin
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz