想了n天的变态问题(有关线程),急救!

Iori_Chiang 2006-08-14 09:04:26
我在做一个有关下载的东西时,如何才能取消,暂停与继续下载线程?

type
TMyDownLoad=class(TThread)
public
sName:string;
procedure Execute;override;
procedure Download;
procedure MsgWrong;
procedure MsgSuccess;
end;

procedure TMyDownLoad.Download;
var
UnitName,PathName:String;
MyStream:TMemoryStream;
IDHTTP: TIDHttp;
begin
sName:=fmMain.eName.Text;
IDHTTP:= TIDHTTP.Create(nil);
MyStream:=TMemoryStream.Create;
try
IdHTTP.Get(fmMain.eUrl.Text,MyStream);
except
Synchronize(MsgWrong);
MyStream.Free;
Exit;
end;
Synchronize(MsgSuccess);
MyStream.SaveToFile(fmMain.ePath.Text+fmMain.eName.Text);
MyStream.Free;
end;

procedure TMyDownLoad.Execute;
begin
inherited;
Download;
end;

procedure TMyDownload.MsgWrong;
begin
showmessage('下载出错!');
end;

procedure TMyDownload.MsgSuccess;
begin
showmessage(sName+'下载完成!');
end;

procedure TfmMain.btnDownloadClick(Sender: TObject);
begin
TMyDownLoad.Create(false);
end;
...全文
199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iori_Chiang 2006-08-15
  • 打赏
  • 举报
回复
我在中断函数中如是写:
procedure TfmMain.btndeleteClick(Sender: TObject);
var
iCX1:integer;
begin
if (fmMain.listTask.ItemIndex>-1)
then begin
fmMain.bStop:=true;
fmMain.aTasks[fmMain.listTask.ItemIndex+1]^.IDHttp.Free;
fmMain.aTasks[fmMain.listTask.ItemIndex+1]^.Free;
//dispose(fmMain.aTasks[fmMain.listTask.ItemIndex+1]);
for iCX1:=fmMain.listTask.ItemIndex+2 to fmMain.iTasks do
begin
fmMain.aTasks[iCX1-1]:=fmMain.aTasks[iCX1];
dec(fmMain.aTasks[iCX1-1].iIndex);
end;
fmMain.aTasks[fmMain.iTasks]:=nil;
dec(fmMain.iTasks);
end
else showmessage('未选择任务!');
end;
可以中断,但是要报错,why?
Iori_Chiang 2006-08-15
  • 打赏
  • 举报
回复
在这种操作中还有个问题:

我有一个数组T: array[1..1000] of TMyDownLoad;
当T[2]下载完成后,并且T[2].Free;
执行这样的操作:T[2]:=T[3];
就要报错。。。。。。
我想的是用链表解决,有没有更好的办法?
Iori_Chiang 2006-08-15
  • 打赏
  • 举报
回复
但是我试了试,做到了!
Iori_Chiang 2006-08-14
  • 打赏
  • 举报
回复
那么,如果我有一个数组T: array[1..1000] of TMyDownLoad;
当T[2]下载完成后,并且T[2].Free;
能否这样赋值:
T[2]:=T[3];
indexhome 2006-08-14
  • 打赏
  • 举报
回复
如楼上所说,完成可以实现,其它线程也是一个类,线程类提供了很多功能,楼主所说的只是其中一部分功能而已。
postren 2006-08-14
  • 打赏
  • 举报
回复
别用匿名变量TMyDownLoad.Create(false);
用全局的命名变量,如
var
T1: TMyDownLoad;

T1 := TMyDownLoad.Create(false);

T1.Resume;//恢复
T1.Suspend;//暂停
T1.Free;//销毁
erhan 2006-08-14
  • 打赏
  • 举报
回复
楼上说的没法做到,现在的问题不是停线程,而是停下载哈。

据说所知是一个连接之内是没法暂停的,只能中断,如果断点续传还差不多。

在TIdHttp的onWork事件里写代码判断关闭条件,来关闭TidHttp,可以中断下载。
Iori_Chiang 2006-08-14
  • 打赏
  • 举报
回复
自己顶

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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