利用QueryPerformanceCounter自定义高精度定时器不起作用

时间:2021-12-22 19:35:02
利用以下延迟函数实现自定义定时播放视频帧:
void CSplitScreenServerDlg::cmDelay(int ms)
{
QueryPerformanceCounter(&m_liDelayBegin);
do 
{
QueryPerformanceCounter(&m_liDelayEnd);
m_dDelayTime = (m_liDelayEnd.QuadPart - m_liDelayBegin.QuadPart)/m_dClockFreq;
} while (m_dDelayTime<0.001*ms);
}

下面是控制定时代码:
QueryPerformanceCounter(&m_liWaitEnd);
while (TRUE)
{
m_liWaitBegin = m_liWaitEnd;
if (1<m_nShowFrame)
{
QueryPerformanceCounter(&m_liWaitEnd);
m_dWaitTime = (m_liWaitEnd.QuadPart - m_liWaitBegin.QuadPart)/m_dClockFreq;
if(nTimeDiff>(int)(m_dWaitTime*1000))
cmDelay(nTimeDiff - (int)(1000*m_dWaitTime));
}

//////////////////////////////////
此部分代码将命令发送到客户端控制播放
//////////////////////////////////
}
m_nReadyClient = 0;
ResetEvent(m_hClientState);
///////////////////////////////////////
客户端播放收到命令播放完一帧之后通知服务器端
m_hClientState设置为singaled
/////////////////////////////////////////
WaitForSingleObject(m_hClientState, nTimeDiff);

--------------------------------------pia,分割--------------------------------
现在的情况是这样的,客户端若在静态链接中使用MFC,播放就比设置的帧频略慢一点(先前是刚好是设置的帧频,改了一些无关紧要的代码之后,又慢了)。在共享中使用MFC时,播放速率就毫不考虑控制代码,直接按快的来。VS2010环境,优化全部去掉了。已经折腾几个星期了,百思不得其解啊,懂的大侠帮帮我啊~~

12 个解决方案

#1


需要的精度太高?

#2


帮顶一下!

#3


帮顶下   这个用过  我只是取间隔  然后每四十毫秒发送一帧  假如定时器不准超过40毫秒在补发一帧

#4


帮顶!

#5


引用 3 楼 ljn398431 的回复:
帮顶下   这个用过  我只是取间隔  然后每四十毫秒发送一帧  假如定时器不准超过40毫秒在补发一帧

-----------------------------------------
我差不多也是这样啊,每40毫秒发一帧,可是它就是毫不理会我的延时函数。在延时函数前后测时间,也没错啊。
快崩溃了,只想用头把屏幕撞碎。

#6


windows的这种时间精度最低是55ms左右。

#7


WINDOWS下面的延时不准。

#8


引用 6 楼 nrxtgcb 的回复:
windows的这种时间精度最低是55ms左右。

---------------------------------------
引用 7 楼 wqhua 的回复:
WINDOWS下面的延时不准。

我用的是自定义的延时,用QueryPerformanceCounter实现的,已测,精度在微妙级的,拜托两位看看代码好吗?

#9


是不是多线程的控制问题

#10


系统有线程调试切换,可能很难满足这么准确的要求

#11


引用 10 楼 fishion 的回复:
系统有线程调试切换,可能很难满足这么准确的要求

线程调试切换?
现在的情况是,我把客户端跟服务器端都用“在共享中使用MFC”,程序就会以最快速度显示每一帧,完全不理会时间控制函数啊。还是撞死在屏幕上比较容易些。

#12


引用 8 楼 showery 的回复:
引用 6 楼 nrxtgcb 的回复:

windows的这种时间精度最低是55ms左右。

---------------------------------------
引用 7 楼 wqhua 的回复:

WINDOWS下面的延时不准。

我用的是自定义的延时,用QueryPerformanceCounter实现的,已测,精度在微妙级的,拜托两位看看代码好吗?


你说的我用过,我才说不准的。

#1


需要的精度太高?

#2


帮顶一下!

#3


帮顶下   这个用过  我只是取间隔  然后每四十毫秒发送一帧  假如定时器不准超过40毫秒在补发一帧

#4


帮顶!

#5


引用 3 楼 ljn398431 的回复:
帮顶下   这个用过  我只是取间隔  然后每四十毫秒发送一帧  假如定时器不准超过40毫秒在补发一帧

-----------------------------------------
我差不多也是这样啊,每40毫秒发一帧,可是它就是毫不理会我的延时函数。在延时函数前后测时间,也没错啊。
快崩溃了,只想用头把屏幕撞碎。

#6


windows的这种时间精度最低是55ms左右。

#7


WINDOWS下面的延时不准。

#8


引用 6 楼 nrxtgcb 的回复:
windows的这种时间精度最低是55ms左右。

---------------------------------------
引用 7 楼 wqhua 的回复:
WINDOWS下面的延时不准。

我用的是自定义的延时,用QueryPerformanceCounter实现的,已测,精度在微妙级的,拜托两位看看代码好吗?

#9


是不是多线程的控制问题

#10


系统有线程调试切换,可能很难满足这么准确的要求

#11


引用 10 楼 fishion 的回复:
系统有线程调试切换,可能很难满足这么准确的要求

线程调试切换?
现在的情况是,我把客户端跟服务器端都用“在共享中使用MFC”,程序就会以最快速度显示每一帧,完全不理会时间控制函数啊。还是撞死在屏幕上比较容易些。

#12


引用 8 楼 showery 的回复:
引用 6 楼 nrxtgcb 的回复:

windows的这种时间精度最低是55ms左右。

---------------------------------------
引用 7 楼 wqhua 的回复:

WINDOWS下面的延时不准。

我用的是自定义的延时,用QueryPerformanceCounter实现的,已测,精度在微妙级的,拜托两位看看代码好吗?


你说的我用过,我才说不准的。