多媒体定时器精度测试有关问题
多媒体定时器精度测试问题
我写了一个程序测试多媒体定时器的精读,但测试结果很不理想,只有当精读设置为250ms以上时才显示无误差。
下面是代码和测试结果
#include "stdafx.h "
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
#pragma comment(lib, "winmm.lib ") //安装多媒体定时器支持库,也可手动将winmm.lib添加到工程中。
#include <string>
#include <vector>
#define N 10
using namespace std;
char buffer[128] = {0};
vector <string> g_times;
void CALLBACK fun(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
{
sprintf(buffer, "Current time:%lu\n ",timeGetTime());
string szTime = buffer;
g_times.push_back(szTime);
}
int _tmain(int argc, _TCHAR* argv[])
{
UINT wTimerRes;//=TIMER_ACCURACY; //定义时间间隔
UINT wAccuracy; //定义分辨率
UINT TimerID; //定义定时器句柄
TIMECAPS tc;
cin > > wTimerRes;
if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR)
{
wAccuracy=min(max(tc.wPeriodMin,wTimerRes),tc.wPeriodMax); //判断分辨率是否在允许范围
timeBeginPeriod(wAccuracy); //设置定时器分辨率
}
//设置定时器回调事件,回调函数形如fun
if((TimerID=timeSetEvent(wTimerRes,wAccuracy,(LPTIMECALLBACK)fun,0,TIME_PERIODIC))==0)
{
printf( "Can 't count!\n ");
}
Sleep(N*wTimerRes); //等待定时器线程执行N*TIMER_ACCURACY ms
timeKillEvent(TimerID);
timeEndPeriod(wAccuracy);
for (vector <string> ::iterator ter = g_times.begin(); ter != g_times.end(); ++ter)
{
string sz = *ter;
cout < < sz;
}
}
结果:
10ms
Current time:4844453
Current time:4844468
Current time:4844468
Current time:4844484
Current time:4844500
Current time:4844500
Current time:4844515
Current time:4844531
Current time:4844531
Current time:4844546
Press any key to continue
50ms
Current time:4861328
Current time:4861374
Current time:4861421
Current time:4861468
Current time:4861515
Current time:4861578
Current time:4861624
Current time:4861671
Current time:4861718
Current time:4861765
Press any key to continue
100
Current time:4875703
Current time:4875796
Current time:4875906
Current time:4875999
Current time:4876093
Current time:4876203
Current time:4876296
Current time:4876406
Current time:4876499
Current time:4876593
Press any key to continue
200
Current time:4888359
Current time:4888562
Current time:4888765
Current time:4888968
Current time:4889156
Current time:4889359
Current time:4889562
Current time:4889765
Current time:4889968
Current time:4890156
Press any key to continue
250
Current time:4903124
Current time:4903374
Current time:4903624
我写了一个程序测试多媒体定时器的精读,但测试结果很不理想,只有当精读设置为250ms以上时才显示无误差。
下面是代码和测试结果
#include "stdafx.h "
#include <stdio.h>
#include <windows.h>
#include <Mmsystem.h>
#pragma comment(lib, "winmm.lib ") //安装多媒体定时器支持库,也可手动将winmm.lib添加到工程中。
#include <string>
#include <vector>
#define N 10
using namespace std;
char buffer[128] = {0};
vector <string> g_times;
void CALLBACK fun(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2)
{
sprintf(buffer, "Current time:%lu\n ",timeGetTime());
string szTime = buffer;
g_times.push_back(szTime);
}
int _tmain(int argc, _TCHAR* argv[])
{
UINT wTimerRes;//=TIMER_ACCURACY; //定义时间间隔
UINT wAccuracy; //定义分辨率
UINT TimerID; //定义定时器句柄
TIMECAPS tc;
cin > > wTimerRes;
if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR)
{
wAccuracy=min(max(tc.wPeriodMin,wTimerRes),tc.wPeriodMax); //判断分辨率是否在允许范围
timeBeginPeriod(wAccuracy); //设置定时器分辨率
}
//设置定时器回调事件,回调函数形如fun
if((TimerID=timeSetEvent(wTimerRes,wAccuracy,(LPTIMECALLBACK)fun,0,TIME_PERIODIC))==0)
{
printf( "Can 't count!\n ");
}
Sleep(N*wTimerRes); //等待定时器线程执行N*TIMER_ACCURACY ms
timeKillEvent(TimerID);
timeEndPeriod(wAccuracy);
for (vector <string> ::iterator ter = g_times.begin(); ter != g_times.end(); ++ter)
{
string sz = *ter;
cout < < sz;
}
}
结果:
10ms
Current time:4844453
Current time:4844468
Current time:4844468
Current time:4844484
Current time:4844500
Current time:4844500
Current time:4844515
Current time:4844531
Current time:4844531
Current time:4844546
Press any key to continue
50ms
Current time:4861328
Current time:4861374
Current time:4861421
Current time:4861468
Current time:4861515
Current time:4861578
Current time:4861624
Current time:4861671
Current time:4861718
Current time:4861765
Press any key to continue
100
Current time:4875703
Current time:4875796
Current time:4875906
Current time:4875999
Current time:4876093
Current time:4876203
Current time:4876296
Current time:4876406
Current time:4876499
Current time:4876593
Press any key to continue
200
Current time:4888359
Current time:4888562
Current time:4888765
Current time:4888968
Current time:4889156
Current time:4889359
Current time:4889562
Current time:4889765
Current time:4889968
Current time:4890156
Press any key to continue
250
Current time:4903124
Current time:4903374
Current time:4903624