社区
C++ Builder
帖子详情
用TIdFTP下载一个比较大的文件时候,如何让使用者知道程序没有死机?
fangrk
2003-09-24 04:00:07
我觉得可以采用下列方法,比如显示下载进度,或者当前下载速率,或者当前已经使用了多少时间。不过不知道怎么做。恳请各位帮忙。
...全文
56
7
打赏
收藏
用TIdFTP下载一个比较大的文件时候,如何让使用者知道程序没有死机?
我觉得可以采用下列方法,比如显示下载进度,或者当前下载速率,或者当前已经使用了多少时间。不过不知道怎么做。恳请各位帮忙。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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基于
TId
FTP
的简单
文件
上传实例
Delphi实现基于
TId
FTP
的简单
文件
上传,源码
用
TId
FTP
实现
文件
上传
只写了
一个
上传,是因为
一个
朋友只要上传功能,
下载
就
没有
写,把源码贴出来供大家学习,当时着急没写几行注释,连错误处理也少得可怜,见谅.可以上传整个目录,单线程
Delphi使用
TId
Ftp
控件实现
FTP
协议
Delphi使用
TId
Ftp
控件实现
FTP
协议
TId
FTP
测试
程序
一个
测试
TId
FTP
控件的小
程序
,包含了连接,在
FTP
服务器上新建
文件
夹,
文件
,删除
文件
夹,
文件
,以及获取
文件
目录。同时包含了
FTP
工具SERV-U 9.0
Delphi线程池实现多线程
FTP
分段
下载
组件
Delphi线程池实现多线程
FTP
分段
下载
组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、
TId
FTP
Indy
FTP
客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在
程序
初始化时生成线程池TThreadPoolDown实例 Share_ThreadPool_
FTP
Down 一、外部调用方法 外部只需要一次性调用
Ftp
Down() 函数向线程池加入
下载
任务,
下载
任务执行中的事件会通过调用时注册的 回调函数 A
Ftp
DownEvent 进行通知。 二、内部工作流程 1、
Ftp
Down()函数将调用TThreadPoolDown.Add
Ftp
Down() ,然后调用TADownFileObj.MakeGetFileSizeObj()分配线程任务 本过程中,将向回调函数 A
Ftp
DownEvent 触发 HEM_ADDURL 事件通知 2、工作线程调用任务对象T
FTP
HeadObj.DoThreadExecute 过程获取远程
文件
大小 备注:该功能实际使用到
FTP
命令SIZE,该命令一些老版本
FTP
服务器有可能不支持 本过程中,若获取
文件
大小成功,将向回调函数 A
Ftp
DownEvent 触发 HEM_GETSIZE 事件通知, 若失败,则触发 HEM_ERROR 事件通知 3、得到远程
文件
大小后,调用TADownFileObj.MakeGetObjs(),分配获取远程
文件
线程任务 本过程中,开始时,将向回调函数 A
Ftp
DownEvent 触发 HEM_WORKBEGIN 事件通知 在接收数据时,向回调函数 A
Ftp
DownEvent 触发 HEM_WORK 事件通知 4、工作线程调用任务对象 T
FTP
GetObj.DoThreadExecute 实际
下载
远程
文件
数据块 每
一个
数据块
下载
任务完成后,触发 HEM_BLOCKOK 事件通知 5、所有数据块完成后,将调用 DoDownloadOK 函数,触发 HEM_DOWNOK 事件通知
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章