假定发送限速为 2M字节/秒。显然,相当于200K/100毫秒。
那么每发送200K数据后,检查耗时,如果耗时小于100毫秒,那么就Sleep( 100-耗时 )这样做以后,结果不佷理想,一般速度都大过2M很多。
有什么好办法,让速度在2M左右波动不大?

解决方案 »

  1.   

    http://bbs.nankai.edu.cn/blog/d/dadingdang/000649.html
      

  2.   

    while循环加上GetTickCount,然后break
      

  3.   

    用GetTickCount进行计时,可以专门开一个线程做计时器。
      

  4.   

    参考:
    http://www.vckbase.com/document/viewdoc/?id=1301
      

  5.   

    或者使用多媒体定时器,参考:
    http://www.codeproject.com/miscctrl/multimediatimer.asp
      

  6.   

    可以使用多媒体计时器记时,精度可以到1ms,然后计算剩下时间转换为一个int 整数,没进一次 -1,等于0执行,下次发送操作
    //////////////////////////////////////////////////////////////////////////
    //说明: 毫秒级定时器,平时的定时器以及Sleep()函数都是以55毫秒为精度的。
    //      这个多媒体定时器提供1ms精度
    //使用: 这个类封装了多媒体定时器,把头文件和源文件加入到你的工程就可以使用这个类,Link
    //中指定winmm.lib, 必须从CMMTimers派生一个类重载成员函数timerProc函数来使用定时器
    //timerProc 将在定时周期结束后被掉用,初始化一个类实例,构造函数参数是定时器的毫秒
    //分辨率,启动一个定时器掉用 startTimer. 
    //////////////////////////////////////////////////////////////////////////
    class CMMTimers  
    {
    public:
    CMMTimers(UINT resolution); 
        virtual ~CMMTimers();
    //////////////////////////////////////////////////////////////////////////
    //作用: 返回定时器分辨率
    //////////////////////////////////////////////////////////////////////////
        UINT getTimerRes() { return timerRes; };
        
    //////////////////////////////////////////////////////////////////////////
    //作用: 启动定时器
    //参数: period 触发定时器的周期如10毫秒1次,oneShot 执行一次还是按周期循环执行
    //注意: 定时器只能启动一次,两次会导致多媒体定时器线程崩溃,启动第二次前必须
    // stopTimer
    //////////////////////////////////////////////////////////////////////////
        bool startTimer(UINT period,bool oneShot);
    //////////////////////////////////////////////////////////////////////////
    //作用: 停止一个周期性定时器
    //////////////////////////////////////////////////////////////////////////
        bool stopTimer();
        
    //定时器调用的函数,必须重载
        virtual void timerProc() {};
        
    protected:
        UINT timerRes; //定时器分辨率精度
        UINT timerId;  //定时器 ID
    BOOL m_bstopflag; //定时器停止标志};
      

  7.   

    GetTickCount准确。你是tcp还是udp。tcp没有必要限制速度把