Take 1.
void Sleep4uSec (long double usec)
{
LARGE_INTEGER start;
LARGE_INTEGER end;
LARGE_INTEGER frequency;
LARGE_INTEGER differance;
//LARGE_INTEGER duration;
long double duration;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter (&start);
for (;;)
{
QueryPerformanceCounter (&end);
differance.QuadPart = end.QuadPart-start.QuadPart;
duration = (long double)(differance.QuadPart*1000000/frequency.QuadPart);
if (usec < duration)
{
//RETAILMSG (1, (L"%f \r\n", duration));
ATLTRACE (L"%f \r\n", duration);
return;
}
}
}
Take 2.
__inline double large_integer_div (LARGE_INTEGER a, const double b)
{
// See the derivation above in operator/ (const ACE_UINT32).
return ((double) 0xffffffffu - b + 1.0) / b * a.HighPart + (double) a.HighPart + (double) a.LowPart / b;
}
__inline LARGE_INTEGER large_integer_sub (LARGE_INTEGER a, LARGE_INTEGER b)
{
LARGE_INTEGER ret;
unsigned __int64 * tmpa = (unsigned __int64 *)&a;
unsigned __int64 * tmpb = (unsigned __int64 *)&b;
unsigned __int64 * tmpc = (unsigned __int64 *)&ret;
//if ((__int64) (*tmpa - *tmpb) < (__int64) 0)
if( b.HighPart > a.HighPart ? 1 : b.HighPart < a.HighPart ? 0 : b.LowPart > a.LowPart)
{
//*tmpc = (unsigned __int64) ~((unsigned __int64) (*tmpa - *tmpb));
*tmpc = *tmpa - *tmpb;
//*tmpc = (unsigned __int64) ~(*tmpc);
*tmpc = 0xffffffffffffffff - *tmpc;
//ret.HighPart = ~ret.HighPart;
//ret.LowPart = ~ret.LowPart;
// ret.HighPart = ~(a.HighPart - b.HighPart);
// ret.LowPart = ~(a.LowPart - b.LowPart);
}
else
{
*tmpc = *tmpa - *tmpb;
}
/*
ret.LowPart = a.LowPart - b.LowPart;
ret.HighPart = a.HighPart - b.HighPart;
if (a.LowPart < b.LowPart)
--ret.HighPart;
*/
return ret;
}
DWORD ThreadProc (LPVOID param)
{
DWORD dwObject;
HANDLE hEvent;
LARGE_INTEGER currcount;
LARGE_INTEGER frequency;
int prev_usec;
int curr_usec;
int diff_usec;
hEvent = CreateEvent (NULL, FALSE, FALSE, L"uSec_Timer_Event");
prev_usec = 0;
curr_usec = 0;
diff_usec = 0;
QueryPerformanceCounter (&currcount);
QueryPerformanceFrequency (&frequency);
#pragma warning (push)
#pragma warning (disable: 4244) // conversion from 'double' to 'int', possible loss of data
prev_usec = large_integer_div (currcount, large_integer_div( frequency, (double)1000000));
#pragma warning (pop)
for(;;)
{
if ((dwObject=WaitForSingleObject(hEvent, INFINITE))== WAIT_OBJECT_0)
{
QueryPerformanceCounter(&currcount);
// QueryPerformanceFrequency(&frequency);
#pragma warning (push)
#pragma warning (disable: 4244) // conversion from 'double' to 'int', possible loss of data
curr_usec = large_integer_div (currcount, large_integer_div( frequency, (double)1000000));
#pragma warning (pop)
diff_usec = (prev_usec > curr_usec) ? diff_usec = ~(curr_usec - prev_usec) : diff_usec = curr_usec - prev_usec;
prev_usec = curr_usec;
if (diff_usec > 1000) // 1000 usec
{
// ...
}
}
else
{
break;
}
}
if (hEvent)
CloseHandle (hEvent);
return 0;
}