本帖最后由 VisualEleven 于 2011-04-27 11:28:51 编辑

解决方案 »

  1.   

    URLDownloadToFile()
    http://www.codeproject.com/KB/IP/urldownload.aspx
      

  2.   

    要么用API查网络流量除以时间自己算,要么根据已下载数据除以时间计算。
    下载剩余时间可以先得到总下载大小,在根据当前下载速度和剩余下载量估算。
      

  3.   

    void CALLBACK CMyTimer::TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
    {
                code;
    }void CMyTimer::SetMyTimer(UINT nElapse)
    {
     m_nTimerID = SetTimer(NULL, NULL, nElapse, TimerProc);
     m_sTimeMap[m_nTimerID] = this;
    }class CMyTimer;
    typedef CMap<UINT,UINT,CMyTimer*,CMyTimer*> CTimerMap;
    class CMyTimer 
    {
    public:
     //设置定时器,nElapse表示时间间隔
     void SetMyTimer(UINT nElapse);
     //销毁该实例的定时器
     void KillMyTimer();
        //保存该实例的定时器标志值
     UINT m_nTimerID;
     //静态数据成员,映射表类,用于保存所有的定时器信息
     static CTimerMap m_sTimeMap;
     //静态成员函数,用于处理定时器的消息
     static void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); CMyTimer();
     virtual ~CMyTimer();
    };
    我是使用定时器实现的,但为什么定时器没有启动。
      

  4.   

    给你的我的定时器类// TimerClass.cpp: implementation of the TimerClass class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "TimerClass.h"//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////TimerClass::TimerClass()
    {
    TimerEvent = NULL;
    State = FALSE;
    Interval = 1000;
    }TimerClass::~TimerClass()
    {}void TimerClass::Play()
    {
    if(State==FALSE){
    State = TRUE;
    ThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)TimerThread,this,0,&ThreadID);
    }
    }void TimerClass::Stop()
    {
    if(State == TRUE){
    State=FALSE;
    CloseHandle(ThreadHandle);
    }
    }DWORD WINAPI TimerClass::TimerThread(LPVOID pParam)
    {
    DWORD NowTickCount;
    DWORD SaveTickCount;
    TimerClass * TimerObj;
    TimerObj = (TimerClass *)pParam;
    NowTickCount = GetTickCount();
    SaveTickCount = NowTickCount;
    while(TRUE){
    Sleep(TimerObj->Interval);
    if(TimerObj->State==FALSE){
    break;
    }
    if(TimerObj->TimerEvent!=NULL){
    TimerObj->TimerEvent();
    }
    }
    return 0;
    }
    // TimerClass.h: interface for the TimerClass class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_TIMERCLASS_H__C550E3B3_80DE_43B9_AD4E_0136C4870720__INCLUDED_)
    #define AFX_TIMERCLASS_H__C550E3B3_80DE_43B9_AD4E_0136C4870720__INCLUDED_
    typedef void(*CTIMEREVENT)();#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class TimerClass  
    {
    public:
    void Stop();
    void Play();
    DWORD Interval;
    CTIMEREVENT TimerEvent;
    TimerClass();
    virtual ~TimerClass();private:
    HANDLE ThreadHandle;
    BOOL State;
    DWORD ThreadID;
    protected:
    static DWORD WINAPI TimerThread(LPVOID pParam);
    };#endif // !defined(AFX_TIMERCLASS_H__C550E3B3_80DE_43B9_AD4E_0136C4870720__INCLUDED_)用起来很简单的#include "stdafx.h"
    #include "TimerClass.h"
    MCTimerClass Timer1;
    static void Timer1_Time(LONG ClassID);
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    //...
    Timer1.ClassID = (LONG)this; // 为 Timer1_Time 传递的参数,任何值都可以
    Timer1.TimerEvent = Timer1_Time; // 相当于处理TimerEvent事件的函数指针
    Timer1.Interval = 100; // 间隔时间,以毫秒为单位
    Timer1.Play(); // 开始触发定时器
    //...
    }
    // 根据上面的设置,每隔100毫秒触发一次该过程,并将 Timer1.ClassID 的值传递给 ClassID 参数
    void Timer1_Time(LONG ClassID)
    {
    //定时器事件处理过程
    }
      

  5.   

    设置定时器,固定时间统计下载的数据量,从而得到下载速度,然后用当前的速度估算未来需要耗费的时间。定时器:1s
    文件大小:Size
    已下载的部分:Downloaded
    前一秒已下载的部分:Downloaded_old剩余时间:(Size - DownLoad) / (Downloaded - Downloaded_old)
      

  6.   

    目前正在学习WINSOCK,好资料啊!