放出几个珍藏多年的延时函数(高低精度高低性能)

 
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include "delay.h"  
  3.   
  4.   
  5.   
  6. void DoEvents()  
  7. {  
  8.     MSG msg;  
  9.     while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) {  
  10.         if (msg.message == WM_QUIT)  
  11.         {  
  12.             return;  
  13.         }  
  14.         TranslateMessage(&msg);  
  15.         DispatchMessage(&msg);  
  16.     }  
  17. }  
  18.   
  19. //@(1)@延时 优点:低cpu;缺点:程序被卡死。  
  20. void NormalDelay(DWORD dwMilliSecond)  
  21. {  
  22.     Sleep(dwMilliSecond);  
  23. }  
  24.   
  25. //@(2)@ 高精度,狂占CPU,单位微秒  
  26. void LowPerformanceHighPrecisionDelay(LONGLONG llMicrosecond)  
  27. {  
  28.   
  29.     LARGE_INTEGER CurrTicks, TicksCount;  
  30.   
  31.     QueryPerformanceFrequency(&TicksCount);  
  32.     QueryPerformanceCounter(&CurrTicks);  
  33.   
  34.     TicksCount.QuadPart = TicksCount.QuadPart * llMicrosecond / 1000000ll;  
  35.     TicksCount.QuadPart += CurrTicks.QuadPart;  
  36.     while (CurrTicks.QuadPart < TicksCount.QuadPart)  
  37.     {  
  38.         QueryPerformanceCounter(&CurrTicks);  
  39.     }  
  40. }  
  41.   
  42.   
  43.   
  44. DWORD WINAPI DelayInThread(LPVOID lpParam)  
  45. {  
  46.     DWORD* pMillSecond = (DWORD*)lpParam;  
  47.     Sleep(*pMillSecond);  
  48.     return 0;  
  49. }  
  50.   
  51.   
  52. //@(3)@多线程实现的不卡死、低cpu,低精度  
  53. BOOL HighPerformanceLowPrecisionDelayDelay(DWORD dwMilliSecond)  
  54. {  
  55.     HANDLE hThread;  
  56.     DWORD  RethThread;  
  57.     hThread = ::CreateThread(nullptr, 0, DelayInThread, &dwMilliSecond, 0, &RethThread);  
  58.     if (hThread == NULL)  
  59.     {  
  60.         return FALSE;  
  61.     }  
  62.   
  63.     for (;;)  
  64.     {  
  65.         DoEvents();  
  66.   
  67.         if (WAIT_TIMEOUT == WaitForSingleObject(hThread, 1))  
  68.         {  
  69.         }  
  70.         else  
  71.         {  
  72.             break;  
  73.         }  
  74.     }  
  75.     CloseHandle(hThread);  
  76.     return TRUE;  
  77. }  
  78.   
  79.   
  80.   
  81.   
  82. //不卡死、低cpu,高精度延时,毫秒  
  83. BOOL HighPerformanceHighPrecisionDelay(UINT64 n64MilliSecond)  
  84. {  
  85.     HANDLE hTimer;  
  86.     LARGE_INTEGER liDueTime;  
  87.   
  88.     liDueTime.QuadPart = -10 * n64MilliSecond * 1000LL;  
  89.   
  90.     DoEvents();  
  91.   
  92.     hTimer = CreateWaitableTimer(nullptr, FALSE, nullptr);  
  93.     if (NULL == hTimer)  
  94.     {  
  95.         return  FALSE;  
  96.     }  
  97.   
  98.     if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))  
  99.     {  
  100.         //printf("SetWaitableTimer failed (%d) ", GetLastError());  
  101.         return FALSE;  
  102.     }  
  103.   
  104.     DWORD ret;  
  105.     while (ret = MsgWaitForMultipleObjects(1, &hTimer, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)  
  106.     {  
  107.         if (((WAIT_OBJECT_0 + 1) == ret) || (WAIT_TIMEOUT == ret))  
  108.         {  
  109.             DoEvents();  
  110.         }  
  111.         else  
  112.         {  
  113.             //WAIT_TIMEOUT,WAIT_FAILED  
  114.             break;  
  115.         }  
  116.     }  
  117.   
  118.     CancelWaitableTimer(hTimer);  
  119.   
  120.     CloseHandle(hTimer);  
  121.   
  122.     DoEvents();  
  123.   
  124.     return TRUE;  
  125.   
  126. }  

http://blog.csdn.net/x356982611/article/details/50922697

原文地址:https://www.cnblogs.com/findumars/p/5342082.html