下载限速,在网上找了找,基本上就是通过sleep,CreateTimerQueue的定时器的方法,又或者是缓冲区的方式进行限速的。刚开始我是通过sleep的方式进行,但是发现这种方法效果不是很好,至少在显示上不是很好,而且在连续性上也比较不理想。最后我采用主要以缩放接受缓冲区大小来进行,这个方法简单,效果也不错。具体的代码,如下,很粗糙,还有优化的余地。对于使用定时器,还没有考虑使用,也没有必要去那么搞的复杂。
//if (dwCurrentTime - dwLastTime >= 100)
{
Sleep(50);
m_uCurrentDownloadSpeed = (m_uDownloadedSize - dwLastDownloadedSize)*1000/(GetTickCount() - dwLastTime+1); //BYTE/
dwLastTime = GetTickCount();
dwLastDownloadedSize = m_uDownloadedSize;
float fTime = m_uCurrentDownloadSpeed*1.0/ (m_uLimitDownloadSpeed + 1);
if (m_dwLastLimitDownloadSpeed !=m_uLimitDownloadSpeed)
{
m_dwLastLimitDownloadSpeed = m_uLimitDownloadSpeed;
m_dwCalSpeedNum= 0;
m_dwBuffSize = 0;
}
if (m_dwBuffSize==0&&abs(fTime*10-10)<= 2)
{
m_dwBuffSize = dwBuffSize;
m_dwCalSpeedNum = 0;
}
if (m_dwBuffSize==0)
{
dwBuffSize = dwBuffSize/(fTime+0.001);
m_dwCalSpeedNum++;
}
else
dwBuffSize = m_dwBuffSize;
if (m_dwCalSpeedNum>5)
{
//dwBuffSize = dwMaxBuff*0.8;
m_dwCalSpeedNum = 0;
}
dwBuffSize = dwBuffSize > dwMaxBuff ?dwMaxBuff: dwBuffSize;
}
}