vc 中如何得到实时的下载速度? 本帖最后由 VisualEleven 于 2011-04-27 11:28:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 URLDownloadToFile()http://www.codeproject.com/KB/IP/urldownload.aspx 要么用API查网络流量除以时间自己算,要么根据已下载数据除以时间计算。下载剩余时间可以先得到总下载大小,在根据当前下载速度和剩余下载量估算。 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();};我是使用定时器实现的,但为什么定时器没有启动。 给你的我的定时器类// 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){ //定时器事件处理过程} 设置定时器,固定时间统计下载的数据量,从而得到下载速度,然后用当前的速度估算未来需要耗费的时间。定时器:1s文件大小:Size已下载的部分:Downloaded前一秒已下载的部分:Downloaded_old剩余时间:(Size - DownLoad) / (Downloaded - Downloaded_old) 目前正在学习WINSOCK,好资料啊! 我用ADO连接数据库是总是提示下面的错误,请大家帮忙…… 32位位图转换为8位灰度图像,调色板如何设置? VC中如何察看当前运行的所有线程,并切换到该线称?? VC6支持标准C++么? MDI中如何能在打开一文档之时,同时关闭其它所有已打开的文档 在VC60中如何完成这样的要求? 请教:怎样锁定计算机? 在对话框种调用单文档问题! 软盘读不出来了,请问如何挽救???!!!一个JJ问我的,兄弟们扎起哦!!! 大侠,请教!!!!!!!!!!!!!!!!!!!!!!!!!! WINDOWS 画图程序里 左边的那个竖着很多按钮的框怎么实现的 局域网通信
http://www.codeproject.com/KB/IP/urldownload.aspx
下载剩余时间可以先得到总下载大小,在根据当前下载速度和剩余下载量估算。
{
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();
};
我是使用定时器实现的,但为什么定时器没有启动。
//
//////////////////////////////////////////////////////////////////////#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)
{
//定时器事件处理过程
}
文件大小:Size
已下载的部分:Downloaded
前一秒已下载的部分:Downloaded_old剩余时间:(Size - DownLoad) / (Downloaded - Downloaded_old)