vc 中如何得到实时的下载速度?

chenyueqing_502 2011-04-27 11:25:23
实现一个下载功能,在下载对话框中实时显示下载速度,及下载剩余时间等。
...全文
321 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dreamcaihao 2012-12-29
  • 打赏
  • 举报
回复
ssyyo_bj 2011-04-28
  • 打赏
  • 举报
回复
目前正在学习WINSOCK,好资料啊!
现在还是人类 2011-04-27
  • 打赏
  • 举报
回复
所谓的实时下载速度也是按秒计算的,直接每秒计算一下当前下载量与上次记录的下载量便可得到从
上一秒到这一秒的下载数据量,这样实时下载速度就得出来了,至于剩余时间,可以将当前下载的数
据量与耗用的秒为单位的时间进行计算,然后通过需要下载的数据大小来预估剩余时间,公式这样:
剩余时间(秒)=须下载数据总大小/(当前耗用时间(秒)/当前下载大小)
然后把剩余时间转换一下格式就可以得到分钟、小时、天等信息了
visualwind 2011-04-27
  • 打赏
  • 举报
回复
要么用API查网络流量除以时间自己算,要么根据已下载数据除以时间计算。
下载剩余时间可以先得到总下载大小,在根据当前下载速度和剩余下载量估算。
Eleven 2011-04-27
  • 打赏
  • 举报
回复
yao050421103 2011-04-27
  • 打赏
  • 举报
回复
设置定时器,固定时间统计下载的数据量,从而得到下载速度,然后用当前的速度估算未来需要耗费的时间。

定时器:1s
文件大小:Size
已下载的部分:Downloaded
前一秒已下载的部分:Downloaded_old

剩余时间:(Size - DownLoad) / (Downloaded - Downloaded_old)
现在还是人类 2011-04-27
  • 打赏
  • 举报
回复
给你的我的定时器类

// 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 > 1000

class 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)
{
//定时器事件处理过程
}
chenyueqing_502 2011-04-27
  • 打赏
  • 举报
回复
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();
};
我是使用定时器实现的,但为什么定时器没有启动。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧