在线等待, 为啥放进线程中就不行了?

confucius 2008-03-08 06:19:11
// 要做的工作很简单,就是用IdHttp打开一个网页,然后用Doc(IHTMLDocument2)
// 来分析抓取一些数据,代码运行正常。但是由于比较费时,所以想用线程来做,
// 可是改成线程后下面的Application.ProcessMessages老是跳不出循环
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := idhttp1.Get('http://www.baidu.com'); // 随便举个例子
WB_LoadHTML(Doc, s);

// 把
while Doc.ReadyState <> 'complete' do
Application.ProcessMessages;

//--------------> 假如线程中能走到此处就算解决了
// ParseHtml;
end;


整个程序的代码简化如下:
http://www.justlamps.us.com/
http://tw.stock.yahoo.com/s/list.php?c=tse&rr=11629791662960.36638015953042296
http://tw.stock.yahoo.com/s/list.php?c=otc&rr=11665957725150.010428710095903737

http://money.hinet.net/stock/z00.htm?A=/z/choice.htm

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, MsHtml;

type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
Doc: IHTMLDocument2;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses activex, StrUtils, ComObj;

procedure WB_LoadHTML(IDoc: IHtmlDocument2; HTMLCode: string);
var
sl: TStringList;
ms: TMemoryStream;
begin
sl := TStringList.Create;
try
ms := TMemoryStream.Create;
try
sl.Text := HTMLCode;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(IDoc as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
finally
sl.Free;
end;
end;

// 要做的工作很简单,就是用IdHttp打开一个网页,然后用Doc(IHTMLDocument2)
// 来分析抓取一些数据,代码运行正常。但是由于比较费时,所以想用线程来做,
// 可是改成线程后下面的Application.ProcessMessages老是跳不出循环
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := idhttp1.Get('http://www.baidu.com'); // 随便举个例子
WB_LoadHTML(Doc, s);

// 把
while Doc.ReadyState <> 'complete' do
Application.ProcessMessages;

//--------------> 假如线程中能走到此处就算解决了
// ParseHtml;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Doc := CreateComObject(Class_HTMLDOcument) as IHTMLDocument2;
end;

end;

end.
...全文
104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
有点难度哦
UndefinedCoder 2008-03-18
  • 打赏
  • 举报
回复
你的线程没有消息循环。
所得寺内 2008-03-18
  • 打赏
  • 举报
回复
Application.ProcessMessages不能用在线程里面
zhaozhen2004 2008-03-18
  • 打赏
  • 举报
回复
首先线程中可以使用Application.ProcessMessages,我的采集程序中就使用了.
我认为你的线程可能有问题,有些对像是线程不安全的.要使用Synchronize
tigerii 2008-03-17
  • 打赏
  • 举报
回复
1。线程内不允许使用Application.ProcessMessages。
2。注意:有些类不能在线程内正常运行。
ZuoBaoquan 2008-03-17
  • 打赏
  • 举报
回复
我想问题可能在于IPersistStreamInit,你搜搜相关的文章
wooden954 2008-03-12
  • 打赏
  • 举报
回复
同意:
在线程里将Application.ProcessMessages;改为
Sleep(50);
Coder1035 2008-03-11
  • 打赏
  • 举报
回复

while Doc.ReadyState <> 'complete' do
Application.ProcessMessages;
注释掉
king_xing 2008-03-08
  • 打赏
  • 举报
回复
在线程里将Application.ProcessMessages;改为
Sleep(50);

16,748

社区成员

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

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