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

不知道我有没有将清楚问题?高手帮帮忙啊!
...全文
231 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyagp 2003-07-25
  • 打赏
  • 举报
回复
线程我会再处理,用threadlist也好,用别的也好。
不过现在不是创建线程的问题,是线程内部的问题。即使一个线程也不行。那个OnDocumentComplete就是不触发。
DWGZ 2003-07-25
  • 打赏
  • 举报
回复
晕, 怎么这样实现, 多线程用ThreadList来管理吧
内容概要:本文围绕“基于非奇异终端滑模控制的两连杆机械臂轨迹跟踪仿真设计研究”展开,系统阐述了非奇异终端滑模控制(NTSMC)在二自由度机械臂高精度轨迹跟踪中的应用。研究聚焦于克服传统滑模控制存在的奇异性问题,提升系统在有限时间内的收敛速度与控制精度,确保控制过程的全局稳定性与强鲁棒性。文章详细介绍了机械臂的非线性动力学建模过程,构建了适用于NTSMC的滑模面与趋近律,结合Lyapunov稳定性理论对闭环控制系统进行了严格的数学证明。通过Matlab编程与Simulink多域仿真平台,对所设计的控制器进行了全面验证,仿真结果表明,该方法即使在存在外部干扰和模型参数不确定性的情况下,依然能够实现期望轨迹的精确、快速跟踪,并有效抑制了控制抖振现象。配套提供的完整Matlab代码与Simulink模型,极大地方便了研究结果的复现与二次开发。; 适合人群:具备自动控制原理、现代控制理论、机器人动力学及非线性系统分析基础的研究生、科研人员和自动化领域的工程技术人员,尤其适合正在从事先进控制算法研究或机器人控制系统开发的专业人士,熟练掌握Matlab/Simulink仿真环境者将能更好地利用本资源。; 使用场景及目标:①作为教学与科研范例,深入理解非奇异终端滑模控制的核心思想、设计流程及其相较于传统滑模控制的优势;②为工业机器人、服务机器人等领域的高精度、强鲁棒性运动控制系统设计提供直接的技术参考与解决方案;③支撑相关学术课题(如非线性控制、智能机器人控制、鲁棒控制等)的仿真验证与论文撰写工作。; 阅读建议:建议读者在阅读理论部分的同时,务必同步运行并调试所提供的Matlab代码与Simulink模型,通过调整控制器参数(如滑模面系数、增益等)来直观观察系统响应的变化,从而深刻理解参数整定对控制性能的影响;鼓励在此基础上探索NTSMC与神经网络、模糊逻辑等智能算法的融合,以进一步提升控制器的自适应能力与实用性。

1,594

社区成员

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

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