很急!问一个关于用webbrowser多线程下载的问题。大家帮帮忙啊!

gyagp 2003-07-25 01:56:36
我打算从服务器端下载一些资源,采用webbrowser控件,每次下载开一个线程。
代码如下:
constructor TDownloadThread.Create(UIName, RcId, URI : String);
begin
InThreadWebBrowser := TWebBrowser.Create(nil);
//设置webbrowser两个事件的响应函数
InThreadWebBrowser.OnNavigateComplete2 := WebBrowserNavigateComplete2;
InThreadWebBrowser.OnDocumentComplete := WebBrowserDocumentComplete;

//设置下载最长时间
TmrLive := TTimer.Create(nil);
TmrLive.Enabled := false;
TmrLive.OnTimer := OnTmrLiveTimer;
TmrLive.Interval := 15000;

CanReturn := false;
IsSuccess := -1;

GlpDisp := nil;
self.UIName := UIName;
self.RcId := RcId;
self.URI := URI;


//启动进程,进程即开始进行execute
inherited Create(true);
end;

function TDownloadThread.DownloadFile(Source, Dest: String): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
except
Result := False;
end;
end;

procedure TDownloadThread.Execute;
begin
TmrLive.Enabled := true;
InThreadWebBrowser.Navigate(URI);

repeat
until CanReturn;
RcManager.DownloadFinish(UIName,RcId,IsSuccess);
end;

procedure TDownloadThread.OnTmrLiveTimer(Sender : TObject);
begin
CanReturn := true;
IsSuccess := 0;
ShowMessage('unfinished');
TmrLive.Enabled := false;
end;

procedure TDownloadThread.WebBrowserDocumentComplete(Sender: TObject; const
pDisp: IDispatch; var URL: OleVariant);
var
Elem: IHTMLElement;
Coll: IHTMLElementCollection;
I: Integer;
J: Integer;
TempURL: String;
CurURL: String;
DirPath: string;
begin
if (GlpDisp <> nil) and (GlpDisp = pDisp) then
begin
GlpDisp := nil;

//webbrowser的navigate完成
ShowMessage('navigate finish');

//设置存放目录
DirPath := 'rc\'+UIName+'\'+RcId;

//创建存放目录
if not DirectoryExists(DirPath) then
if not CreateDir(DirPath) then
raise Exception.Create('Cannot create directory');

DirPath := DirPath + '\';


log.info(InThreadWebBrowser.OleObject.document.documentelement.innerHTML);
//分析body.background
//先分析出所在目录
CurURL := (InThreadWebBrowser.Document as IHTMLDocument2).url;
for J := length(CurURL)-1 downto 0 do
begin
if (CurURL[J] = '/') or (CurURL[J] = '\') then
begin
break;
end;
end;
CurURL := LeftStr(CurURL,J);


Coll := (InThreadWebBrowser.Document as IHTMLDocument2).all;
Coll := (Coll.Tags('body') as IHTMLElementCollection);
for I := 0 to Coll.Length - 1 do begin // 循环取出每个url
Elem := (Coll.Item(I, 1) as IHTMLElement);
TempURL := Trim(String(Elem.GetAttribute(WideString('background'), 0)));
for J := Length(TempURL)-1 downto 0 do
begin
if (TempURL[J] = '/') or (TempURL[J] = '\') then
begin
break;
end;
end;
// ShowMessage(DirPath+RightStr(TempURL,Length(TempURL)-J));
DownloadFile(CurURL+TempURL,DirPath+RightStr(TempURL,Length(TempURL)-J));
Elem.SetAttribute(WideString('background'),RightStr(TempURL,Length(TempURL)-J),1);
end;



//分析img.src
Coll := (InThreadWebBrowser.Document as IHTMLDocument2).all;
Coll := (Coll.Tags('img') as IHTMLElementCollection);
for I := 0 to Coll.Length - 1 do begin // 循环取出每个url
Elem := (Coll.item(I, 0) as IHTMLElement);
TempURL := Trim(string(Elem.GetAttribute(WideString('src'), 0)));
for J := Length(TempURL)-1 downto 0 do
begin
if (TempURL[j] = '/') or (TempURL[j] = '\') then
begin
break;
end;
end;
DownloadFile(TempURL,DirPath+RightStr(TempURL,Length(TempURL)-J));
Elem.SetAttribute(WideString('src'),RightStr(TempURL,Length(TempURL)-J),1);
end;

AssignFile(HtmlFile,DirPath+RcId+'.htm');
Rewrite(HtmlFile);
Writeln(HtmlFile,InThreadWebBrowser.OleObject.document.documentelement.innerHTML);
CloseFile(HtmlFile);

CanReturn := true;
IsSuccess := 1;
end;
end;

procedure TDownloadThread.WebBrowserNavigateComplete2(Sender: TObject;const
pDisp: IDispatch; var URL: OleVariant);
begin
if GlpDisp = nil then
GlpDisp := pDisp;
ShowMessage('navigate finish');
end;

procedure THttpDownload.Download(UIName, RcId, URI : String);
begin
DownloadThread := TDownloadThread.Create(UIName,RcId,URI);
DownloadThread.Resume();
end;

end.

不好意思,有些长。
其中TDownloadThread为我定义的一个新的线程。下载请求时,调用THttpDownload的Download方法,在这个方法中,创建一个线程为我完成下载工作。
在这个线程中,调用它所有的一个webbrowser去navigate页面,然后等待。我用webbrowser的OnNavigateComplete2和OnDocumentComplete两个消息一起来确定是否Navigate完成。现在的问题时OnNavigateComplete2的消息能正确响应,而响应OnDocumentComplete的函数总得不到响应?

不知道我有没有将清楚问题?高手帮帮忙啊!
...全文
179 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyagp 2003-07-25
  • 打赏
  • 举报
回复
线程我会再处理,用threadlist也好,用别的也好。
不过现在不是创建线程的问题,是线程内部的问题。即使一个线程也不行。那个OnDocumentComplete就是不触发。
DWGZ 2003-07-25
  • 打赏
  • 举报
回复
晕, 怎么这样实现, 多线程用ThreadList来管理吧

1,594

社区成员

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

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