关于把idhttp放到线程当中进行下载,主窗体仍就不能响应其他操做的问题。

cdsun 2006-04-09 11:12:11
把idhttp放到线程当中进行下载,主窗体仍就不能响应其他操做的问题。
不知道应该怎么解决。第一次用线程和idhttp研究了两天实在搞不定。还是来这里请教一下大家。
我把代码贴上
很简单的代码
unit1.pas
.....
.....
implementation
uses
download;
.....
....

procedure TForm1.Button1Click(Sender: TObject);
var
downloadTD:TMyDownLoad;
begin
downloadTD:=TMyDownLoad.Create(false);
end;


线程的代码如下:
interface

uses
Windows,Classes,Messages, SysUtils,Dialogs,idhttp;

type
TMyDownLoad = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure DownLoad;
end;

implementation

procedure TMyDownLoad.Execute;
begin
{ Place thread code here }
if Terminated then exit;
Synchronize(Download);
end;

procedure TMyDownLoad.Download;
Var
UnitName,PathName:String;
MyStream:TMemoryStream;
filepath:string;
IDHTTP: TIDHttp;
begin
IDHTTP:= TIDHTTP.Create(nil);
MyStream:=TMemoryStream.Create;
try
IdHTTP.Get('http://127.0.0.1/aiyouasp/testcode/11.exe',MyStream);
except
showmessage('网络出错未能下载完成!');
MyStream.Free;
Exit;
end;
filepath:=ExtractFilePath(ParamStr(0));
MyStream.SaveToFile(filepath+'\DownLoadFiles\11.exe');
MyStream.Free;
showmessage('下载完成!');
end;
end.
我想问问为什么放到了线程和没有放到线程当中的效果是一样的?
是我哪里弄错了。大家多指教。
...全文
336 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞狼兄 2006-07-18
  • 打赏
  • 举报
回复
学习
zjh527 2006-04-12
  • 打赏
  • 举报
回复
1、在idhttp.OnWork事件里加Application.ProcessMessages;
在窗体上放个idhttp控件,写他的OnWork方法。
procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
Application.ProcessMessages;
end;

2、
//在主窗体中定义一个线程类
type
TMyDownLoad=class(TThread)
protected
procedure Execute;override;
procedure Download;
end;

type
TFMain = class(TForm)
....

procedure TMyDownLoad.Download;
Var
UnitName,PathName:String;
MyStream:TMemoryStream;
filepath:string;
IDHTTP: TIDHttp;
begin
IDHTTP:= TIDHTTP.Create(nil);
MyStream:=TMemoryStream.Create;
try
IdHTTP.Get('http://127.0.0.1/aiyouasp/testcode/11.exe',MyStream);
except
showmessage('网络出错未能下载完成!');
MyStream.Free;
Exit;
end;
filepath:=ExtractFilePath(ParamStr(0));
MyStream.SaveToFile(filepath+'\DownLoadFiles\11.exe');
MyStream.Free;
showmessage('下载完成!');
end;
procedure TMyDownLoad.Execute
begin
inherited;
Download;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyDownLoad.Create(false);
end;
noelse520 2006-04-10
  • 打赏
  • 举报
回复
我是冰水混合物,路过接分
cdsun 2006-04-10
  • 打赏
  • 举报
回复
sleep?
cdsun 2006-04-10
  • 打赏
  • 举报
回复
怎么弄呢?

能不能具体说说
Almzg_0 2006-04-10
  • 打赏
  • 举报
回复
让这个线程睡几秒吧,要不cpu资源全被占用
zjh527 2006-04-10
  • 打赏
  • 举报
回复
因为你使用了 Synchronize(Download); 同步机制,这就相当占用了程序的主线程。

1、在OnWork事件里加Application.ProcessMessages;
2、在你的主程序定义一个线程类
type
TRequestURL=class(TThread)
protected
procedure Execute;override;
end;
然后将你的下载加到Execute里,然后通过TRequestURL.Create(False);方法调用。
cdsun 2006-04-09
  • 打赏
  • 举报
回复
另外谁能告诉我怎么样得到下载的状态信息!

比如总共多大,已经下载了多大,当前速度,还有用时

我在它的onwork里面激活timer但是他也是没有响应,并没有按照我的意思去工作。不知道怎么搞

大家多帮帮忙阿
cdsun 2006-04-09
  • 打赏
  • 举报
回复
关注的朋友帮顶阿
谢谢了
qxhou 2006-04-09
  • 打赏
  • 举报
回复
关注,我近来也在学习线程

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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