[cpp] view plain copy
- #include "stdafx.h"
- #include "delay.h"
- void DoEvents()
- {
- MSG msg;
- while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) {
- if (msg.message == WM_QUIT)
- {
- return;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- //@(1)@延时 优点:低cpu;缺点:程序被卡死。
- void NormalDelay(DWORD dwMilliSecond)
- {
- Sleep(dwMilliSecond);
- }
- //@(2)@ 高精度,狂占CPU,单位微秒
- void LowPerformanceHighPrecisionDelay(LONGLONG llMicrosecond)
- {
- LARGE_INTEGER CurrTicks, TicksCount;
- QueryPerformanceFrequency(&TicksCount);
- QueryPerformanceCounter(&CurrTicks);
- TicksCount.QuadPart = TicksCount.QuadPart * llMicrosecond / 1000000ll;
- TicksCount.QuadPart += CurrTicks.QuadPart;
- while (CurrTicks.QuadPart < TicksCount.QuadPart)
- {
- QueryPerformanceCounter(&CurrTicks);
- }
- }
- DWORD WINAPI DelayInThread(LPVOID lpParam)
- {
- DWORD* pMillSecond = (DWORD*)lpParam;
- Sleep(*pMillSecond);
- return 0;
- }
- //@(3)@多线程实现的不卡死、低cpu,低精度
- BOOL HighPerformanceLowPrecisionDelayDelay(DWORD dwMilliSecond)
- {
- HANDLE hThread;
- DWORD RethThread;
- hThread = ::CreateThread(nullptr, 0, DelayInThread, &dwMilliSecond, 0, &RethThread);
- if (hThread == NULL)
- {
- return FALSE;
- }
- for (;;)
- {
- DoEvents();
- if (WAIT_TIMEOUT == WaitForSingleObject(hThread, 1))
- {
- }
- else
- {
- break;
- }
- }
- CloseHandle(hThread);
- return TRUE;
- }
- //不卡死、低cpu,高精度延时,毫秒
- BOOL HighPerformanceHighPrecisionDelay(UINT64 n64MilliSecond)
- {
- HANDLE hTimer;
- LARGE_INTEGER liDueTime;
- liDueTime.QuadPart = -10 * n64MilliSecond * 1000LL;
- DoEvents();
- hTimer = CreateWaitableTimer(nullptr, FALSE, nullptr);
- if (NULL == hTimer)
- {
- return FALSE;
- }
- if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
- {
- //printf("SetWaitableTimer failed (%d) ", GetLastError());
- return FALSE;
- }
- DWORD ret;
- while (ret = MsgWaitForMultipleObjects(1, &hTimer, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
- {
- if (((WAIT_OBJECT_0 + 1) == ret) || (WAIT_TIMEOUT == ret))
- {
- DoEvents();
- }
- else
- {
- //WAIT_TIMEOUT,WAIT_FAILED
- break;
- }
- }
- CancelWaitableTimer(hTimer);
- CloseHandle(hTimer);
- DoEvents();
- return TRUE;
- }
http://blog.csdn.net/x356982611/article/details/50922697