timerdauer stimmt nicht
-
Ich bin auf ein eigenartiges Problem gestoßen
Wenn ich mein Programm(ein kleines Spiel) öffne, und zugleich das Programm im C++-Builder geöffnet habe, dann funktioniert alles problemlos.
Wenn ich aber das Programm ohne den C++-Builder öffne, dann läuft alles deutlich langsamer ab:verwende dem Timer folgendermaßen:
HANDLE hTimer = NULL;
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = (-10000000/(20*(4+optionwert[0])));
hTimer = CreateWaitableTimer(NULL, TRUE, "WaitableTimer");
SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0);...
WaitForSingleObject(hTimer, INFINITE);
optionwert[0] soll die Geschwindigkeit einstellen und vorher wird der Wert zugewiesen
Wenn ich jetzt ohne den C++-Builder das Programm starte, dann läuft das Spiel aber mit der geschwindigkeit ab, als ob optionwert[0]=1, egal ob optionwert[0]=1 oder optionwert[0]=9, aber der Wert von liDueTime.QuadPart stimmt mit dem gewollten Wert überein.
Wo liegt das Problem?
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Naja, bei optionwert[0] == 1 bist du auf 10ms und bei optionwert[0] == 9 auf 3,8ms.
Windows tickt normalerweise mit ~15ms (je nach Version leicht unterschiedlich), also zu langsam für deine kurzen Wartezeiten.Was du versuchen kannst, ist die "Auflösung" von Windows mittels timeBeginPeriod() hochzusetzen.
http://msdn.microsoft.com/en-us/library/dd757624(VS.85).aspxint main() { int timerPeriod = 0; for (int i = 1; i < 10; i++) { if (::timeBeginPeriod(i) == TIMERR_NOERROR) { timerPeriod = i; break; } } RestVomProgramm(); if (timerPeriod) ::timeEndPeriod(timerPeriod); }EDIT: fehler im code korrigiert
-
Warum machst Du da eine for-Schleife???
-
eigenartig finde ich, dass es manchmal auch ohne geöffneten C++-Builder richtig funktioniert(mit Wartezeit ungefähr 5ms) und manchmal nicht
außerdem, wenn ich bei "liDueTime.QuadPart = (-10000000/(20*(4+optionwert[0])));"
statt "20*(4+optionwert[0])" "40*(4+optionwert[0])" eingebe, dann läuft das Programm doppelt so schnell ab, aber eben auch langsamer als es eigentlich sollte und über optionwert[0] kann ich die Geschwindigkeit nicht ändern
deshalb kann das Problem eigentlich nicht an der Auflösung von Windows liegen
-
Es war doch die Auflösung des Timers. Danke für die Hilfe!
-
Jochen Kalmbach schrieb:
Warum machst Du da eine for-Schleife???
Ich glaube die fixe 1 sollte wohl eher i sein.
(Iteriere bis von 1 bis 9 und versuche es zu setzen falls es nicht klappt versuch es noch mal etc bis es das erste mal klappt => break;)
-
evilissimo schrieb:
Jochen Kalmbach schrieb:
Warum machst Du da eine for-Schleife???
Ich glaube die fixe 1 sollte wohl eher i sein.
(Iteriere bis von 1 bis 9 und versuche es zu setzen falls es nicht klappt versuch es noch mal etc bis es das erste mal klappt => break;)ooops, ja, genau das.
habs korrigiert