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;
}


 

Posted by 셈말짓기 :