home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / diski117.zip / dhry_tmr.c < prev    next >
C/C++ Source or Header  |  1999-10-28  |  3KB  |  145 lines

  1. /* dhry_tmr.c
  2.  *
  3.  * Author:  Kai Uwe Rommel <rommel@ars.de>
  4.  * Created: Thu Dec 21 1995
  5.  */
  6.  
  7. static char *rcsid =
  8. "$Id: dhry_tmr.c,v 1.2 1999/10/28 17:35:29 rommel Exp rommel $";
  9. static char *rcsrev = "$Revision: 1.2 $";
  10.  
  11. /*
  12.  * $Log: dhry_tmr.c,v $
  13.  * Revision 1.2  1999/10/28 17:35:29  rommel
  14.  * fixed timer code
  15.  *
  16.  * Revision 1.1  1999/10/25 08:36:19  rommel
  17.  * Initial revision
  18.  * 
  19.  */
  20.  
  21. #include <stdio.h>
  22.  
  23. extern unsigned long Number_Of_Runs;
  24.  
  25. #define THREADSTACK 65536
  26.  
  27. #ifdef OS2
  28.  
  29. #define INCL_DOS
  30. #define INCL_NOPM
  31. #include <os2.h>
  32.  
  33. typedef QWORD TIMER;
  34.  
  35. VOID APIENTRY timer_thread(ULONG nArg)
  36. {
  37.   HEV hSem;
  38.   HTIMER hTimer;
  39.  
  40.   DosCreateEventSem(0, &hSem, DC_SEM_SHARED, 0);
  41.   DosAsyncTimer(nArg, (HSEM) hSem, &hTimer);
  42.   DosWaitEventSem(hSem, SEM_INDEFINITE_WAIT);
  43.   DosStopTimer(hTimer);
  44.   DosCloseEventSem(hSem);
  45.  
  46.   Number_Of_Runs = 0;
  47.  
  48.   DosExit(EXIT_THREAD, 0);
  49. }
  50.  
  51. int start_alarm(int nSeconds)
  52. {
  53.   TID tid;
  54.  
  55.   Number_Of_Runs = -1;
  56.  
  57.   return DosCreateThread(&tid, timer_thread, nSeconds * 1000, 0, THREADSTACK);
  58. }
  59.  
  60. int start_timer(TIMER *nStart)
  61. {
  62.   if (DosTmrQueryTime(nStart))
  63.     return printf("Timer error.\n"), -1;
  64.  
  65.   return 0;
  66. }
  67.  
  68. unsigned long stop_timer(TIMER *nStart, int accuracy)
  69. {
  70.   ULONG nFreq;
  71.   TIMER nStop;
  72.  
  73.   if (DosTmrQueryTime(&nStop))
  74.     return printf("Timer error.\n"), -1;
  75.   if (DosTmrQueryFreq(&nFreq))
  76.     return printf("Timer error.\n"), -1;
  77.  
  78.   nFreq = (nFreq + accuracy / 2) / accuracy;
  79.  
  80.   return (* (__int64*) &nStop - * (__int64*) nStart) / nFreq;
  81. }
  82.  
  83. #endif
  84.  
  85. #ifdef WIN32
  86.  
  87. /* the following perhaps only works with IBM's compiler */
  88. #define _INTEGRAL_MAX_BITS 64
  89. #include <windows.h>
  90.  
  91. typedef LARGE_INTEGER TIMER;
  92.  
  93. DWORD CALLBACK timer_thread(void * pArg)
  94. {
  95.   Sleep((long) pArg * 1000);
  96.  
  97.   Number_Of_Runs = 0;
  98.  
  99.   return 0;
  100. }
  101.  
  102. int start_alarm(long nSeconds)
  103.   DWORD ttid;
  104.  
  105.   Number_Of_Runs = -1;
  106.  
  107.   if (CreateThread(0, THREADSTACK, timer_thread, (void *) nSeconds, 0, &ttid) == NULL)
  108.     return printf("Cannot create timer thread.\n"), -1;
  109.  
  110.   return 0;
  111. }
  112.  
  113. int start_timer(TIMER *nStart)
  114. {
  115.   if (!QueryPerformanceCounter(nStart))
  116.     return printf("Timer error.\n"), -1;
  117.  
  118.   return 0;
  119. }
  120.  
  121. unsigned long stop_timer(TIMER *nStart, int nAccuracy)
  122. {
  123.   TIMER nStop, nFreq;
  124.  
  125.   if (!QueryPerformanceCounter(&nStop))
  126.     return printf("Timer error.\n"), -1;
  127.   if (!QueryPerformanceFrequency(&nFreq))
  128.     return printf("Timer error.\n"), -1;
  129.  
  130.   nFreq.QuadPart = (nFreq.QuadPart + nAccuracy / 2) / nAccuracy;
  131.  
  132.   return (nStop.QuadPart - nStart->QuadPart) / nFreq.QuadPart;
  133. }
  134.  
  135. #endif
  136.  
  137. void main(int argc, char **argv)
  138. {
  139.   extern void dhry_main(int argc, char **argv);
  140.   dhry_main(argc, argv);
  141. }
  142.  
  143. /* end of dhry_tmr.c */
  144.