很急!问一个关于用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的函数总得不到响应?

不知道我有没有将清楚问题?高手帮帮忙啊!
...全文
128 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
gyagp 2003-07-25
线程我会再处理,用threadlist也好,用别的也好。
不过现在不是创建线程的问题,是线程内部的问题。即使一个线程也不行。那个OnDocumentComplete就是不触发。
回复
DWGZ 2003-07-25
晕, 怎么这样实现, 多线程用ThreadList来管理吧
回复
相关推荐
一个多线程问题大家帮帮忙吧!
} 然后在按了一个按扭之后启动一个线程,这个线程调用A类的一个静态方法,这静态方法要操作Form1中的WebBrowser,这静态方法通过委托(delete_webbrowser)封装一个方法(_get_page)来操作那个WebBrowser: public ...
关于Winform的一个多线程问题
当我的Start方法使用单线程时没有问题,改用了多线程后,被绑定的RightBrowser_Started方法中this.Document.InvokeScript("ShowMsg", objects);这行提示: 指定的转换无效。 找了半天没找着问题在哪,请各位帮帮...
关于线程 调用webbrowser问题
又遇到麻烦了,就想多线程操作webbrowser 空间 可是 却出错。我调用其他空间都还正常。 上网查了查 ,说webbrowser 不能跨线程调用。各位大虾们帮帮忙。 其实我要实现的功能简单,webbrowser 访问一个查询界面,...
关于WebBrowser事件触发的问题!!
} WebBrowser.Navigagte貌似是异步的,因为每次都会先输出start,但我理想的认为事件的触发事件也是多线程的,所以在输出start后,视下载是否结束而输出complete,所以complete会在0-9的数字之间。 但实际情况是先...
多线程webbrowser连续多次访问更新问题。。
昨天的基本解决,可多线程同时抓取不同网站不同页面下的学生登录网页信息,并返回验证码 可是带来的新的问题,再抓回来后,我却不能继续操作这个webbrowser了,看了下帖子,说wb只能STA模式,这通过委托可以解决...
多线程下调类的使用问题
http://topic.csdn.net/u/20120910/10/9d3eb9bc-09ce-44cd-af7c-09d0585a7cf3.html 同一个问题,另开贴子,这里我重新整理了下,希望能有人下我的,全部分就这些了.... 主窗体的代码: WorkThread = new ...
200元+100分求一个关于网络访问的代码!
朋友的,我的水平有限,用WebBrowser控件搞了一个,但是这太慢了,了代理就更慢了,让人等的花儿都谢了 2.正好向高手学习下,提高自己的水平,加强交流 3.给高手带来一点小小的收入(虽然少,但是种心意)...
c# WebBrowser开发参考资料--杂七杂八
c# WebBrowser开发参考资料 http://hi.baidu.com/motiansen/blog/item/9e99a518233ca3b24aedbca9.html==================使用ObjectForScripting属性,可启用 WebBrowser 控制项所装载之 Web 网页与...
多线程什么时候应该释放
我在做一个多页面浏览器, 我想打开一个网址就建立一个线程线程里创建webbrowser和tabsheet 那么有个问题: 就是说,创建的线程应该什么时候结束么?是创建完webbrowser和tabsheet就结束 还是说,等我free那个...
Winform WebBrowser 如何实现 url 重复提交
} 我要动态改变url的值如此循环每行,直到没有数据为止 这样做ui 会被占用 不知道用多线程能否解决,多线程不了解 不知哪位大侠能帮小弟给下,急用,谢谢!问题问得不专业,小弟才接触编程没多久。麻烦帮帮忙。...
有关c#中主程序走完才能走webBrowser的DocumentCompleted代码
在网上查了很多内容,还是不能解决webBrowser控件在wb.Navigate()后的 wb_DocumentCompleted +=new....... 代码 了BeginInvoke,join,myResetEvent都不能解决程序在主线程没完成前,先将DocumentCompleted中的代码 ...
vb/vb.net开发精粹(9)
Domino下使用Wininet的FtpGetFile方法下载文件失败 求指教,视屏监控接口如何写?? filelistbox如何排序? 关于数据库的两问题 “VB与EXCEL、VB与ACCESS”的问题 VB画线 百思不得其解VB编小程序的错误 ...
我在CSDN参与的3000帖子
2:100分急求,随机输出十小写字母,但是,要求这十字母不相同 3:求Sn=a+aa+aaa+…+aaa…a(na)之值 4:数组题 望高手帮忙! 5:呵呵,来推荐一下我的网站,本站提供大量当今流行的免费的音乐和免费电影,...
VC++中可能遇到的问题
T 如何程序控制电源管理设置 Q 我们知道在电源选项 属性 里面可以设置 关闭监视器 1分钟之后,...,从不 关闭硬盘 1分钟之后,...,从不 待机时间 1分钟之后,...,从不请问这些设置我怎么程序来实现 比如我...
VC++中可能遇到的问题收藏
VC++中可能遇到的问题收藏 | 旧篇: 在VC中动态加载ODBC时的一些小细节 function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d....
Network Thread
我在多线程使用CSocket的,怎么老是出错,请大家帮我看看!VC中使用IXMLHTTPRequest获取URL信息的问题,有代码*********************************************如何通过IXMLHTTPRequest下载文件?300分请教如何向...
VS.NET 学习方法论
——我的VS.NET学习之旅 屠恩海(SunHai) 开发工具:Microsoft Visual Studio .NET 2003 操作系统:Windows XP 题记:即使你没有一点编程经验,只要你愿意,并理解本文介绍的学习方法,你也可以象作者一样轻松、...
WPF数据爬取小工具-某宝推广位批量生成,及订单爬取 记:接单最痛次的感悟...
当然期间遇到一个小小的问题就是界面样式的问题,起初使用的winform开发,但是样式,你懂的,所以后来索性直接使用wpf. 先声明:这里只做经验分享,不提供其他支持,毕竟,,,不安全。   1.首先...
使用WebClient自动填写并提交ASP.NET页面表单
使用WebClient自动填写并提交ASP.NET页面表单 ...比如,要提交一个如下图所示的登录表单: 填写和提交以上表单的代码如下: // 要提交表单的URI字符串。 string uriString = "http://www.xxx.com/Login.aspx"; 
vb/vb.net开发精粹(18)
求帮忙把段SQL转成VB代码,谢谢! combox显示问题 有关StrConv转换函数问题~~高手进来看看~ ACCESS窗体运行中提示"对象无效或不再被设置" 如何VB读取excel里的数值啊? EXCEL中 VB求助 又来救助咯! 照着...
vb/vb.net开发精粹(14)
VBA如何获取控件句柄? 各位大侠看看我这程序 求解 小白向各位请教下VB过滤广告的问题 关于回调函数的问题 ...新手请教ocx文件创建的问题 ...如何vb自动填写、选择下拉框选项...各位大侠帮帮忙 这样的功能在MSHFlexGri
Win32 & .Net Q&A
CSDN 讨论总结系列:Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/561501.aspx) Jiangsheng的CSDN Digest (Oct 2005)...
mvp申请资料
MVP到底水有深,当然对于思归孟子这样的大牛来说,我们可望不可及,但是已本人的水平,我相信大部分有进取心的朋友都能达到。以下是我申请材料中的部分关键数据,因为我以前看过蝈蝈的mvp申请材料,所以也愿意把...
链接:MSDN UserNet等
 T可塌陷的PanelBar界面比outlookbar更有吸引力,Windows XP左边的导航工具面版就是采用这种风格,采用这种风格的应用程序也越来越,比如各种杀毒软件,可能delphi提供的vcl组件可以简化这种操作,对于这种“傻瓜...
Win32 & .Net Q&A 200509铪铪
CSDN 讨论总结系列:Jiangsheng的CSDN Digest (Dec 2005)(http://blog.csdn.net/jiangsheng/archive/2005/12/24/561501.aspx) Jiangsheng的CSDN Digest (Oct 2005)...
PPT模板下载
PPT模板下载我只是想要点积分啊 
vue-devtools chrome 插件
chrome(谷歌浏览器)vue代码调试插件, 已打包。解压后,通过chrome扩展程序加载即可使用。 使用方法: 1、chrome浏览器输入地址“chrome://extensions/”进入扩展程序页面 2、勾选开发者模式 3、点击“加载已解压的扩展程序...”按钮,选择解压后的chrome文件夹,即可添加成功。 4、添加完vue-devtools扩展程序之后,我们在调试vue应用的时候,ch rome开发者工具中会看一个vue的一栏,点击之后就可以看见当前页面vue对象的一些信息
《UML面向对象需求分析与建模教程》 邹盛荣 主编 电子版 2016.01 .doc
PPT已在CSDN均可免费下载 《UML面向对象需求分析与建模教程》 邹盛荣 主编 电子版 2016.01 .doc 当当网上可购买纸质书: http://product.dangdang.com/23766413.html
ArcGIS for JavaScript
全面介绍ArcGIS for JavaScript 开发 让大家学会ArcGIS for JavaScript 开发
JavaEE详解-全程实战案例
肖老师这套课程:抛弃传统的知识点教学模式,采用全程案例教学模式,通过网上书城项目,把所有的JavaEE需要掌握的重要知识点都融入项目中,使学员可以掌握实用的知识,同时获得佳实践. 主要涉及内容有:多表查询、翻页、多条件查询、文件上传/下载、过滤器、监听器、AJAX、事务处理等。 采用案例教学模式,通过网上书城项目,把所有的JavaEE需要掌握的重要知识点都融入项目中
发帖
网络通信/分布式开发
创建于2007-08-02

1573

社区成员

Delphi 网络通信/分布式开发
申请成为版主
帖子事件
创建了帖子
2003-07-25 01:56
社区公告
暂无公告