Moin
Beim Basteln an meinem Spiel (DropOff) (Werbung :P) ist mir beim einbau eines Geschwindigkeitsreglers aufgefallen, dass die unvollkommene Sleep-Funktion meine Ansprüche nur unzureichend bis garnicht erfüllt.
Jeder Wert wird auf den Ganzen Zehner gerundet.
Das ist mir relativ wurscht, wenn ich 10sek warten will. dann machen Abweichungen von 1-10ms keine Probleme, aber wenn es mal darauf ankommt, dass es exakt ist taugt diese Funktion nicht.
Nach kurzer nachforschung kam raus, dass dieses Problem mit AutoIt nur nach dem Prinzip Endlosschleife mit Abbruchkriterium Zielzeit zu lösen ist. Das verschwendet natürlich die Energie der der Prozessor auch für sinnvollere Tätigkeiten einsetzen könnte.
In C++ ist dieses Thema zum Glück mit relativ geringen Aufwand lösbar. (WaitableTimer).
Aufgerufen werden muss die Funktion mit einem DllCall
[autoit]Func _Sleep($a) ; in ms. Auch Kommazahlen möglich
DllCall($DLL, 'none:cdecl', '_Sleep', 'int', 10000*Round($a, 4))
EndFunc
Hab die Funktion ohne Rückgabewert gemacht (läuft so reibungsloser und schneller ab)
Wichtig !
Das Runden auf 4 Stellen und das Multiplizieren mit 10.000 ist nötig, da die Dll intern mit nanosekunden arbeitet statt mit millisekunden.
So ist es möglich auch ms-Angaben mit Kommazahl zu geben.
Die Funktion unterliegt natürlich den üblichen Schwankungen. bei 5.62ms können auch mal 6.2 oder 5.4 rauskommen. der Mittelwert ist aber ziemlich exakt das Eingegebene.
Anbei die Dll
(Wenn hier jemand ist der weiß wie man eine Dll als Ressource in ein Skript einbauen kann währe ich dankbar mir mitzuteilen wie das geht. ich mag es nicht wenn ein Programm immer weitere Dateien mitschleppt....)
mfg
Mars(i)