T
Sry dass es so lang gedauert hat, aber ich hab einiges ausprobiert und das braucht seine zeit...
hustbaer schrieb:
@Timmy: keine Ahnung was es da hat. Dein Code ist IMO auch einigermassen schauderhaft.
Ich würde mich über Anregungen wie es besser aussehen könnte freuen
Paar Kleinigkeiten:
hustbaer schrieb:
verwende timeGetTime() statt GetTickCount().
Gibt es Unterschiede zw. den beiden Funktionen? ich hab in der MSDN keine finden können
hustbaer schrieb:
ruf beim Programmbeginn 1x timeBeginPeriod(2) (oder 1) auf, und bei Programmende 1x timeEndPeriod.
mach ich...
hustbaer schrieb:
IO machst du am besten erst nachdem du die Zeit ermittelt hast, sonst entsteht ein unnötiges Delay zwischen dem Event und dem "auf die Uhr gucken".
ebenfalls schon umgesetzt...
hustbaer schrieb:
Stell die Priorität des Replay-Threads mit SetThreadPriority auf THREAD_PRIORITY_HIGHEST oder sogar THREAD_PRIORITY_TIME_CRITICAL.
Hab das über den Task-Manager probiert, habe aber keinen Unterschied feststellen können.
hustbaer schrieb:
Verwende Zeitangaben die mit 0 = Skriptbeginn anfangen
Hol dir die aktuelle Zeit, und berechne daraus dein Delay zum Warten
ebenfalls schon umgesetzt...
sothis_ schrieb:
ohne mir ehrlichgesagt den code durchgelesen zuhaben ein kleiner tipp am rande. du solltest den highperformance counter für synchronisationszeugs unter windows benutzen.
Danke! Hab zwar nach einem genauen Timer gesucht, aber nur dieses GetTickCount gefunden
sothis_ schrieb:
auf meinem system unter windows xp hat dieser timer allerdings immernoch per default 55ms auflösung
Dieses Prolem hab ich nicht, bei mir ist 1/HighPerformanceFrequency() irgendwo bei 1,6*10^-07 s
sothis_ schrieb:
um für einen zeitraum zu warten, solltest du nicht sleep() und konsorten benutzen, sondern einen waitable timer
Der liefert leider genau so schlechte Ergebnisse wie Sleep
sothis_ schrieb:
das alles im allem gibt genügend genauigkeit
Tut es leider nicht - die Zeiten passen immer noch nicht...
ich hab mir allerdings eine eigene Funktion erstellt GetMyTicks() welche folgendes zurück gibt:
double_zu_long((double)m_LastCount.QuadPart*10000.0/(double)m_CounterFrequency.QuadPart);
dies verwende ich nun statt GetTickCount()
ebenfalls habe ich das warten in Form von einem Busy-Wait umgesetzt (dank Dual-Core nur halb so schlimm, auf "normalen" CPUs hab ich es noch nicht getestet)
long sl = schlafeBisZeitstempel - (GetMyTicks() - programmstartZeitstempel);
while (sl > 0) {
sl = schlafeBisZeitstempel - (GetMyTicks() - programmstartZeitstempel)
}
damit schläft das programm (zumindest laut logs) genau so lange wie es soll - allerdings passen die ausgelösten Tastendrücke zeitlich immer noch nicht zusammen (erkennt man am Verhalten der Anwendung)