das was schlüsselbein gesagt hat, normalerweise sollte man kein realtime brauchen.
hab das hier eben zusammengecodet, ka ob das so wirklich läuft:
Code:
class FakeSleeper
{
private:
public:
LARGE_INTEGER Frequency;
LARGE_INTEGER NeededSteps;
private:
public:
bool Init();
void SetSleepTime(UINT NumberOfMicroSeconds);
void FakeSleep();
};
bool FakeSleeper::Init()
{
if (QueryPerformanceFrequency(&Frequency)) // PerfomanceCounter supported?
{
if (Frequency.QuadPart > 1000000) // Frequency high enough to get diffs ~ 1µSecond?
{
return true;
}
}
return false;
}
void FakeSleeper::SetSleepTime( UINT NumberOfMicroSeconds )
{
NeededSteps.QuadPart = Frequency.QuadPart/(1000000/NumberOfMicroSeconds);
}
void FakeSleeper::FakeSleep()
{
LARGE_INTEGER A;
QueryPerformanceCounter(&A);
LARGE_INTEGER B;
B.QuadPart = A.QuadPart;
while (B.QuadPart - A.QuadPart < NeededSteps.QuadPart)
{
QueryPerformanceCounter(&B);
}
}
erzeugt bei mir mit werten >= 3mikrosekunden akzeptable ergebnisse mit folgendem code:
Code:
FakeSleeper Test;
if (!Test.Init())
{
printf("FAIL!\n");
}
else
{
Test.SetSleepTime(3);
printf("Testing now:\n");
LARGE_INTEGER A;
LARGE_INTEGER B;
LARGE_INTEGER D;
LARGE_INTEGER F;
double Seconds;
QueryPerformanceFrequency(&F);
for (UINT i = 0; i < 20; i++)
{
QueryPerformanceCounter(&A);
Test.FakeSleep();
QueryPerformanceCounter(&B);
D.QuadPart = B.QuadPart - A.QuadPart;
Seconds = (1.0/F.QuadPart)*D.QuadPart;
printf("Time Needed: %.012f\n", Seconds);
}
}
eben so hingerotzt, keine garantie für fehler.
EDIT1:
berücksichtigt btw. nicht die zeit für den funktionsaufruf, den check und den return, kann also kumultativ zu ner recht hohen fehlermarge führen.
EDIT2:
und da du kein "echtes" sleep mehr hast wird dir das teil nen cpu kern voll auslasten