Advertisement
Guest User

windows timers

a guest
Jul 1st, 2015
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.52 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <uuids.h>
  4. #include <dsound.h>
  5. #include <math.h>
  6. #include <strmif.h>
  7.  
  8. // compile as
  9. // winegcc -g timers.cpp -lwinmm -lole32 -lstrmiids
  10.  
  11. static int totalTime = 5; // sec
  12.  
  13.  void wait(HANDLE object, int milliseconds)
  14.  {
  15.   LARGE_INTEGER frequency;
  16.   QueryPerformanceFrequency(&frequency);
  17.   double f = frequency.QuadPart;
  18.   double period = 1000.0 / f; // in ms
  19.  
  20.   LONGLONG previous = 0L;
  21.   double sum = 0.;
  22.   double sum2 = 0.;
  23.  
  24.   int k = 0;
  25.   do
  26.   {
  27.     WaitForSingleObject(object, INFINITE);
  28.     ++k;
  29.  
  30.     LARGE_INTEGER t1;
  31.     QueryPerformanceCounter(&t1);
  32.  
  33.     if (k > 1)
  34.     {
  35.       double thisGap = double(t1.QuadPart - previous) * period;
  36.       sum += thisGap;
  37.       sum2 += thisGap * thisGap;
  38.     }
  39.     previous = t1.QuadPart;
  40.   }
  41.   while (k < totalTime * 1000 / milliseconds); // number of waits for 10 seconds
  42.  
  43.   double average = double(sum) / double(k - 1);
  44.   double average2 = double(sum2) / double(k - 1);
  45.   double stddev = sqrt(average2 - average * average);
  46.  
  47.   printf("k: %d\n", k);
  48.   printf("average: %g\n", average);
  49.   printf("stddev: %g\n", stddev);
  50. }
  51.  
  52. void main1(int milliseconds)
  53. {
  54.   HANDLE hTimer;
  55.   LARGE_INTEGER liDueTime = { 0 };
  56.  
  57.   printf("CreateWaitableTimer\n");
  58.  
  59.   hTimer = CreateWaitableTimer (NULL, FALSE, NULL);
  60.   SetWaitableTimer(hTimer, &liDueTime, milliseconds, NULL, NULL, 0);
  61.  
  62.   wait(hTimer, milliseconds);
  63. }
  64.  
  65. void main2(int milliseconds)
  66. {
  67.   HANDLE g_hSemaphore;
  68.   IReferenceClock *g_RefClock;
  69.   DWORD_PTR g_dwAdviseToken;
  70.  
  71.   printf("IReferenceClock\n");
  72.  
  73.   g_hSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
  74.   CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
  75.   CoCreateInstance(CLSID_SystemClock, NULL, CLSCTX_INPROC, IID_IReferenceClock, (LPVOID*)&g_RefClock);
  76.  
  77.   REFERENCE_TIME rtPeriod = (REFERENCE_TIME)(10000 * milliseconds);
  78.   REFERENCE_TIME rtNow;
  79.  
  80.   g_RefClock->GetTime(&rtNow);
  81.  
  82.   // VS Build
  83. #ifdef _MSC_VER
  84.   g_RefClock->AdvisePeriodic(rtNow + rtPeriod, rtPeriod, g_hSemaphore, &g_dwAdviseToken);
  85. #else
  86.   g_RefClock->AdvisePeriodic(rtNow + rtPeriod, rtPeriod, (HSEMAPHORE)g_hSemaphore, &g_dwAdviseToken);
  87. #endif
  88.  
  89.   wait(g_hSemaphore, milliseconds);
  90. }
  91.  
  92. VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
  93. {
  94.   HANDLE & gDoneEvent = *(HANDLE*)lpParam;
  95.   SetEvent(gDoneEvent);
  96. }
  97.  
  98. void main3(int milliseconds)
  99. {
  100.   HANDLE hTimer;
  101.   HANDLE hTimerQueue;
  102.   HANDLE gDoneEvent;
  103.  
  104.   printf("CreateTimerQueueTimer\n");
  105.  
  106.   gDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  107.   hTimerQueue = CreateTimerQueue();
  108.   CreateTimerQueueTimer(&hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, &gDoneEvent, 0, milliseconds, 0);
  109.  
  110.   wait(gDoneEvent, milliseconds);
  111. }
  112.  
  113. void main4(int milliseconds)
  114. {
  115.   HANDLE gDoneEvent;
  116.  
  117.   printf("timeSetEvent\n");
  118.  
  119.   gDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  120.  
  121.   int resolution = 0;
  122.   timeSetEvent(milliseconds, resolution, (LPTIMECALLBACK)gDoneEvent, 0, TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
  123.  
  124.   wait(gDoneEvent, milliseconds);
  125. }
  126.  
  127. int main(int argc, char * argv[])
  128. {
  129.   if (argc == 3)
  130.   {
  131.     const char * mstr = argv[1];
  132.     int milliseconds = atoi(mstr);
  133.    
  134.     printf("Waiting every %d milliseconds for %d seconds...\n", milliseconds, totalTime);
  135.    
  136.     char c = argv[2][0];
  137.     switch (c)
  138.     {
  139.     case '1': main1(milliseconds); break;
  140.     case '2': main2(milliseconds); break;
  141.     case '3': main3(milliseconds); break;
  142.     case '4': main4(milliseconds); break;
  143.     }
  144.   }
  145.   return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement