用TIdFTP下载一个比较大的文件时候,如何让使用者知道程序没有死机?

fangrk 2003-09-24 04:00:07
我觉得可以采用下列方法,比如显示下载进度,或者当前下载速率,或者当前已经使用了多少时间。不过不知道怎么做。恳请各位帮忙。
...全文
56 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shally5 2003-09-25
  • 打赏
  • 举报
回复
定义全局变量
TDateTime STime;
int AverageSpeed;
long BytesToTransfer ;
int FileLenCount;
int FileLenCurrentCount;
bool AbortTransfer;
在发送时记录起始时间
void __fastcall TForm1::IdFTP1WorkBegin(TObject *Sender,
TWorkMode AWorkMode, const int AWorkCountMax)
{
STime = Now();
if (AWorkCountMax > 0)
{
ProgressBar1->Max = AWorkCountMax;

}
else
{
ProgressBar1->Max = BytesToTransfer;
}
AverageSpeed = 0;
FileLenCount=AWorkCountMax/1024;
}
//结束时
void __fastcall TForm1::IdFTP1WorkEnd(TObject *Sender, TWorkMode AWorkMode)
{
StatusBar1->Panels->Items[2]->Text = "Transfer complete.";
BytesToTransfer = 0;
ProgressBar1->Position = 0;
AverageSpeed = 0;
FileLenCount=0;
FileLenCurrentCount=0;
StatusBar1->Panels->Items[3]->Text="";
}


//发送时的平均速度或/接收时平均速度
void __fastcall TForm1::IdFTP1Work(TObject *Sender, TWorkMode AWorkMode,
const int AWorkCount)
{
AnsiString s;
TDateTime TotalTime;
WORD H, M, Sec, MS;
double DLTime;

TotalTime = Now() - STime;
DecodeTime(TotalTime, H, M, Sec, MS);
Sec = Sec + M * 60 + H * 3600;
DLTime = Sec + MS / 1000;
FileLenCurrentCount=AWorkCount/1024;
if (DLTime > 0)
AverageSpeed = (AverageSpeed + (AWorkCount / 1024) / DLTime) / 2;

s = FormatFloat("0.00 KB/s", AverageSpeed);

switch (AWorkMode)
{ case wmRead:
{ StatusBar1->Panels->Items[2]->Text = "Download speed " + s;
if(FileLenCurrentCount>0)
StatusBar1->Panels->Items[3]->Text="下载 "+IntToStr(FileLenCurrentCount)+" KB 总计 "+IntToStr(FileLenCount)+" KB";
break;
}
case wmWrite:
{
StatusBar1->Panels->Items[2]->Text = "Upload speed " + s;
if(FileLenCurrentCount>0)
StatusBar1->Panels->Items[3]->Text="上传 "+IntToStr(FileLenCurrentCount)+" KB 总计 "+IntToStr(FileLenCount)+" KB";
}
};

if (AbortTransfer)
IdFTP1->Abort();

ProgressBar1->Position = AWorkCount;
AbortTransfer = false;
}
shally5 2003-09-25
  • 打赏
  • 举报
回复
在使用idFTP时,只作进度条显示上下载进度是不行的,它动不了的。
还要加入IdAntiFreeze控件,才能行。。。。。。
fathappy 2003-09-25
  • 打赏
  • 举报
回复
同意,用进度条
fangrk 2003-09-25
  • 打赏
  • 举报
回复
好,先给分,明天拷贝去试
fangrk 2003-09-25
  • 打赏
  • 举报
回复
好,先给分,明天拷贝去试
meCAD 2003-09-24
  • 打赏
  • 举报
回复
做个进度条不就行了.
Santos 2003-09-24
  • 打赏
  • 举报
回复
能获得当前已经收到的字节数,下面的运算自己做吧:)
Delphi线程池实现多线程FTP分段下载组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、TIdFTP Indy FTP客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在程序初始化时生成线程池TThreadPoolDown实例 Share_ThreadPool_FTPDown 一、外部调用方法 外部只需要一次性调用 FtpDown() 函数向线程池加入下载任务,下载任务执行中的事件会通过调用时注册的 回调函数 AFtpDownEvent 进行通知。 二、内部工作流程 1、FtpDown()函数将调用TThreadPoolDown.AddFtpDown() ,然后调用TADownFileObj.MakeGetFileSizeObj()分配线程任务 本过程中,将向回调函数 AFtpDownEvent 触发 HEM_ADDURL 事件通知 2、工作线程调用任务对象TFTPHeadObj.DoThreadExecute 过程获取远程文件大小 备注:该功能实际使用到FTP命令SIZE,该命令一些老版本FTP服务器有可能不支持 本过程中,若获取文件大小成功,将向回调函数 AFtpDownEvent 触发 HEM_GETSIZE 事件通知, 若失败,则触发 HEM_ERROR 事件通知 3、得到远程文件大小后,调用TADownFileObj.MakeGetObjs(),分配获取远程文件线程任务 本过程中,开始时,将向回调函数 AFtpDownEvent 触发 HEM_WORKBEGIN 事件通知 在接收数据时,向回调函数 AFtpDownEvent 触发 HEM_WORK 事件通知 4、工作线程调用任务对象 TFTPGetObj.DoThreadExecute 实际下载远程文件数据块 每一个数据块下载任务完成后,触发 HEM_BLOCKOK 事件通知 5、所有数据块完成后,将调用 DoDownloadOK 函数,触发 HEM_DOWNOK 事件通知

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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