15,471
社区成员
发帖
与我相关
我的任务
分享
LARGE_INTEGER Frequency;
LARGE_INTEGER StartTicks, CurrentTicks;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartTicks);
do
{
//Sleep(1);
QueryPerformanceCounter(¤tTicks);
}while(CurrentTicks - StartTitcks > ...);
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
do
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
}while(dfTim<0.000001);
#define _WIN32_WINNT 0x0500
#include <Windows.h>
#include <stdio.h>
#define ERASE_TIME_IN_MILLISEC(c, s, f)\
(((double)c.QuadPart - s.QuadPart) / f.QuadPart * 1000)
#define USE 2
#define DELAY_TIME 100 // microseconds (0.001 milliseconds)
#define TIMMER_COUNT ((1000 / DELAY_TIME) * 2)
LARGE_INTEGER g_lnFrequency = {0};
LARGE_INTEGER g_lnStartPerfmcCount= {0};
LARGE_INTEGER g_lnCurrPerfmcCount = {0};
HANDLE g_hEvent = NULL;
void CALLBACK TimerFunction(UINT wTimerID, UINT msg,
DWORD dwUser, DWORD dw1, DWORD dw2)
{
QueryPerformanceCounter(&g_lnCurrPerfmcCount);
printf("TimerID : %d erase time : %lf\n", wTimerID,
ERASE_TIME_IN_MILLISEC(g_lnCurrPerfmcCount, g_lnStartPerfmcCount, g_lnFrequency));
g_lnStartPerfmcCount.QuadPart = g_lnCurrPerfmcCount.QuadPart;
}
void CALLBACK TimerProc(void* lpParametar,
BOOLEAN TimerOrWaitFired)
{
// int *p = (int *)lpParametar;
QueryPerformanceCounter(&g_lnCurrPerfmcCount);
// printf("ThreadID : %d para : %4d erase time : %lf\n", GetCurrentThreadId(), *p,
// ERASE_TIME_IN_MILLISEC(g_lnCurrPerfmcCount, g_lnStartPerfmcCount, g_lnFrequency));
printf("erase time : %lf\n",
ERASE_TIME_IN_MILLISEC(g_lnCurrPerfmcCount, g_lnStartPerfmcCount, g_lnFrequency));
g_lnStartPerfmcCount.QuadPart = g_lnCurrPerfmcCount.QuadPart;
}
int main(int, char **, char **)
{
QueryPerformanceFrequency(&g_lnFrequency);
g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
#if 1 == USE
LARGE_INTEGER lnFrequency = {0};
LARGE_INTEGER lnStartPerfmcCount= {0};
LARGE_INTEGER lnCurrPerfmcCount = {0};
lnFrequency.QuadPart = g_lnFrequency.QuadPart;
do
{
QueryPerformanceCounter(&lnStartPerfmcCount);
// 这儿期望可以短暂延时,降低CPU使用率
WaitForSingleObject(g_hEvent, 0);
QueryPerformanceCounter(&lnCurrPerfmcCount);
printf("wait time : %lf milliseconds\n",
ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency));
} while (TRUE);
#elif 2 == USE
LARGE_INTEGER lnFrequency = {0};
LARGE_INTEGER lnStartPerfmcCount = {0};
LARGE_INTEGER lnStartPerfmcCountTmp = {0};
LARGE_INTEGER lnFirstStartPerfmcCount = {0};
LARGE_INTEGER lnLastStartPerfmcCount = {0};
LARGE_INTEGER lnCurrPerfmcCount = {0};
lnFrequency.QuadPart = g_lnFrequency.QuadPart;
TIMECAPS tc;
timeGetDevCaps(&tc, sizeof(TIMECAPS));
UINT unResolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
timeBeginPeriod(unResolution);
// 首次创建定时器较耗时,因此单独先创建一个定时器,但不使用
timeKillEvent(
timeSetEvent(1, 0, (LPTIMECALLBACK)g_hEvent, NULL, TIME_ONESHOT | TIME_CALLBACK_EVENT_SET));
MMRESULT mmrTimmer = NULL;
MMRESULT mmrTimmerTmp = NULL;
timeSetEvent(1, 0, (LPTIMECALLBACK)g_hEvent, NULL, TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
QueryPerformanceCounter(&lnStartPerfmcCount);
lnFirstStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
do
{
mmrTimmer = timeSetEvent(
1, 0, (LPTIMECALLBACK)g_hEvent, NULL, TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
QueryPerformanceCounter(&lnCurrPerfmcCount);
Judge:
if (ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency) * 1000 < DELAY_TIME)
{
if (NULL != mmrTimmerTmp)
{
timeKillEvent(mmrTimmerTmp);
}
mmrTimmerTmp = mmrTimmer;
lnStartPerfmcCountTmp.QuadPart = lnCurrPerfmcCount.QuadPart;
}
else
{
if (NULL != mmrTimmerTmp)
{
mmrTimmerTmp = NULL;
lnStartPerfmcCount.QuadPart = lnStartPerfmcCountTmp.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
goto Judge;
}
else
{
lnStartPerfmcCount.QuadPart = lnCurrPerfmcCount.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
}
}
} while (ERASE_TIME_IN_MILLISEC(lnLastStartPerfmcCount, lnFirstStartPerfmcCount, lnFrequency) <= 1.0);
if (NULL != mmrTimmerTmp)
{
timeKillEvent(mmrTimmerTmp);
mmrTimmerTmp = NULL;
}
do
{
QueryPerformanceCounter(&lnStartPerfmcCount);
WaitForSingleObject(g_hEvent, INFINITE);
QueryPerformanceCounter(&lnCurrPerfmcCount);
printf("wait time : %lf milliseconds\n",
ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency));
} while (TRUE);
#elif 3 == USE
int nTimmerExist[TIMMER_COUNT] = {0};
int nTimmerLength = DELAY_TIME / 2;
int nTimmerCount = 0;
LARGE_INTEGER lnFrequency = {0};
LARGE_INTEGER lnStartPerfmcCount = {0};
LARGE_INTEGER lnFirstStartPerfmcCount = {0};
LARGE_INTEGER lnCurrPerfmcCount = {0};
lnFrequency.QuadPart = g_lnFrequency.QuadPart;
int nIndex = 0;
MMRESULT mmrTimmer = NULL;
do
{
// mmrTimmer = timeSetEvent(
// 1, 0, (LPTIMECALLBACK)g_hEvent, NULL, TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
mmrTimmer = timeSetEvent(
1, 0, (LPTIMECALLBACK)TimerFunction, NULL, TIME_PERIODIC);
QueryPerformanceCounter(&lnCurrPerfmcCount);
if (0 == lnFirstStartPerfmcCount.QuadPart)
{
nTimmerExist[0] = 1;
lnFirstStartPerfmcCount.QuadPart = lnCurrPerfmcCount.QuadPart;
}
else
{
nIndex = (lnCurrPerfmcCount.QuadPart - lnFirstStartPerfmcCount.QuadPart) / nTimmerLength
% TIMMER_COUNT;
if (0 == nTimmerExist[nIndex])
{
nTimmerExist[nIndex] = 1;
}
else
{
timeKillEvent(mmrTimmer);
continue;
}
}
nTimmerCount++;
} while (nTimmerCount < TIMMER_COUNT);
do
{
QueryPerformanceCounter(&lnStartPerfmcCount);
WaitForSingleObject(g_hEvent, INFINITE);
QueryPerformanceCounter(&lnCurrPerfmcCount);
printf("wait time : %lf milliseconds\n",
ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency));
} while (TRUE);
#elif 4 == USE
LARGE_INTEGER lnFrequency = {0};
LARGE_INTEGER lnStartPerfmcCount = {0};
LARGE_INTEGER lnStartPerfmcCountTmp = {0};
LARGE_INTEGER lnFirstStartPerfmcCount = {0};
LARGE_INTEGER lnLastStartPerfmcCount = {0};
LARGE_INTEGER lnCurrPerfmcCount = {0};
lnFrequency.QuadPart = g_lnFrequency.QuadPart;
HANDLE hTimmerTmp = NULL;
HANDLE hTimmer = NULL;
::CreateTimerQueueTimer(
&hTimmer,
NULL,
TimerProc,
NULL,
0,
0,
WT_EXECUTEINTIMERTHREAD);
DeleteTimerQueueTimer(NULL, hTimmer, NULL);
::CreateTimerQueueTimer(
&hTimmer,
NULL,
TimerProc,
NULL,
0,
1,
WT_EXECUTEINTIMERTHREAD);
QueryPerformanceCounter(&lnStartPerfmcCount);
lnFirstStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
do
{
::CreateTimerQueueTimer(
&hTimmer,
NULL,
TimerProc,
NULL,
0,
1,
WT_EXECUTEINTIMERTHREAD);
QueryPerformanceCounter(&lnCurrPerfmcCount);
Judge2:
if (ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency) * 1000 < DELAY_TIME)
{
if (NULL != hTimmerTmp)
{
DeleteTimerQueueTimer(NULL, hTimmer, NULL);
}
hTimmerTmp = hTimmer;
lnStartPerfmcCountTmp.QuadPart = lnCurrPerfmcCount.QuadPart;
}
else
{
if (NULL != hTimmerTmp)
{
hTimmerTmp = NULL;
lnStartPerfmcCount.QuadPart = lnStartPerfmcCountTmp.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
goto Judge2;
}
else
{
lnStartPerfmcCount.QuadPart = lnCurrPerfmcCount.QuadPart;
lnLastStartPerfmcCount.QuadPart = lnStartPerfmcCount.QuadPart;
}
}
} while (ERASE_TIME_IN_MILLISEC(lnLastStartPerfmcCount, lnFirstStartPerfmcCount, lnFrequency) <= 1.0);
if (NULL != hTimmerTmp)
{
DeleteTimerQueueTimer(NULL, hTimmerTmp, NULL);
hTimmerTmp = NULL;
}
do
{
QueryPerformanceCounter(&lnStartPerfmcCount);
WaitForSingleObject(g_hEvent, INFINITE);
QueryPerformanceCounter(&lnCurrPerfmcCount);
printf("wait time : %lf milliseconds\n",
ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency));
} while (TRUE);
#elif 5 == USE
int nTimmerExist[TIMMER_COUNT] = {0};
int nTimmerLength = DELAY_TIME / 2;
int nTimmerCount = 0;
LARGE_INTEGER lnFrequency = {0};
LARGE_INTEGER lnStartPerfmcCount = {0};
LARGE_INTEGER lnFirstStartPerfmcCount = {0};
LARGE_INTEGER lnCurrPerfmcCount = {0};
lnFrequency.QuadPart = g_lnFrequency.QuadPart;
HANDLE hTimmer;
int nIndex = 0;
do
{
::CreateTimerQueueTimer(
&hTimmer,
NULL,
TimerProc,
&nTimmerExist[nTimmerCount],
0,
1,
WT_EXECUTEINTIMERTHREAD);
QueryPerformanceCounter(&lnCurrPerfmcCount);
if (0 == lnFirstStartPerfmcCount.QuadPart)
{
nTimmerExist[0] = 1;
lnFirstStartPerfmcCount.QuadPart = lnCurrPerfmcCount.QuadPart;
}
else
{
nIndex = (lnCurrPerfmcCount.QuadPart - lnFirstStartPerfmcCount.QuadPart) / nTimmerLength
% TIMMER_COUNT;
if (0 == nTimmerExist[nIndex])
{
nTimmerExist[nIndex] = nTimmerCount + 1;
}
else
{
DeleteTimerQueueTimer(NULL, hTimmer, NULL);
continue;
}
}
nTimmerCount++;
} while (nTimmerCount < TIMMER_COUNT);
do
{
QueryPerformanceCounter(&lnStartPerfmcCount);
WaitForSingleObject(g_hEvent, INFINITE);
QueryPerformanceCounter(&lnCurrPerfmcCount);
printf("wait time : %lf milliseconds\n",
ERASE_TIME_IN_MILLISEC(lnCurrPerfmcCount, lnStartPerfmcCount, lnFrequency));
} while (TRUE);
#endif
return 0;
}
LARGE_INTEGER time ;
LONGLONG start=0;
double dDlay=0;
QueryPerformanceCounter(&time) ;
start = liTemp.QuadPart ;
while (dDlay- 5.0 < 0.1) // Delay 5ms
{
QueryPerformanceCounter(&time) ;
dDlay= (time.QuadPart - start);
}