各位高手,帮忙看个多线程的问题!!!

ming6424 2006-03-16 05:58:03
我想编个程序,能得到一些网页的数据。
该程序大致过程如下,点击Open按钮,弹出一个打开文件对话框,读入一个文件(url列表)的内容到一个memo中;再点击Get按钮,则每次从memo中读取一行,取得url,再调用Tcppwebbrowser去访问该url
然后再获得该网页的的信息,如标题等。
现在的问题是,点击Get后,我想用多线程做。
请大家指点一下。

Get按钮的处理大致如下:
iCount = mmoURL->Lines->Count;// 得到url的个数
while (m_iIndex < iCount)
{
AnsiString sURL = mmoURL->Lines->Strings[m_iIndex]; // 得到一个url

m_iIndex++; // 当前访问的url

TThreadProxy *pThread = new TThreadProxy(true);
cpp->Navigate2(TVariant(sURL), NULL, NULL, NULL); // 访问该网页
DWORD dwResult = WaitForSingleObject(m_hEvent, INFINITE);
switch (dwResult)
{
case WAIT_OBJECT_0:
pThread->Resume();
break;

}
ResetEvent(m_hEvent);
}

TCppWebBrowser的处理过程大致如下:
NavigateComplete2(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
SetEvent(m_hEvent);
}

但线程好像根本就没有执行。
请问,哪里出了问题???
...全文
111 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming6424 2006-03-17
  • 打赏
  • 举报
回复
楼上的帅哥:Waiting4you(毛毛) ( )

我将代码改为如下的,好像也不行啊!
Get OnClick
{
while (m_iIndex < iCount)
{
lblCurrent->Caption = AnsiString("Current: ") + IntToStr(m_iIndex + 1);
AnsiString sURL = mmoURL->Lines->Strings[m_iIndex];
TThreadSurf *pThreadSurf = new TThreadSurf(false, sURL); // 访问网页
m_iIndex++;
}
}

TCppWebBrowser的NavigateComplete2
{
TThreadAnalyse *pThread = new TThreadAnalyse(false); // 分析网页
}

感觉有问题,也的确有问题???
请问应该如何修改呢???
Waiting4you 2006-03-17
  • 打赏
  • 举报
回复
线程里的Form1->CppWebBrowser1->Navigate(BSTR(S));原则应该用Synchronize方法同步,偶是偷懒,真做软件的时候不要这样做.但是Form1->evCmp->WaitFor(30000);这句不要放同步里去,不然和最上面的第一个程序一样的问题
Waiting4you 2006-03-17
  • 打赏
  • 举报
回复
下面的我的代码:分析ListBox1里的url列表,把网页标题存入ListBox2里
主界面Form1里加入ListBox1,里面放url列表;CppWebBrowser1,ListBox2用来放分析网页的结果(这里只是读网页标题),Get按钮.
在Form1的public里声明 TEvent *evCmp;,用来同步分析结果(VCL封装的事件类,在SyncObjs.hpp里),并在构造函数和析构函数里evCmp=new TEvent(NULL,false,false,NULL,false);和delete
(我用的是BCB2006,在BCB6里面没有后面的那个false.)

建立一线程,在public里声明 TStringList *SL;用来存放URL列表,并在构造函数和析构函数里new和delete

Get_OnClick的代码:
{
TScanWeb *sw=new TScanWeb(true);//线程则每次从ListBox1中读取一行,取得url
sw->FreeOnTerminate=true; //自动释放
sw->SL->Assign(ListBox1->Items);//把ListBox1里的URL列表放入线程的SL里
sw->Resume();
}
void __fastcall TForm1::CppWebBrowser1NavigateComplete2(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
ListBox2->Items->Add(CppWebBrowser1->LocationName);
evCmp->SetEvent();
}
线程代码:
void __fastcall TScanWeb::Execute()
{
//---- Place thread code here ----
for(int i=0;i<SL->Count;i++)
{
WideString S=SL->Strings[i];
Form1->CppWebBrowser1->Navigate(BSTR(S));
Form1->evCmp->WaitFor(30000);
}

}
Waiting4you 2006-03-16
  • 打赏
  • 举报
回复
除非你的Get按钮的OnClick里的代码也放到一个线程里去.
Waiting4you 2006-03-16
  • 打赏
  • 举报
回复
Get按钮的OnClick里DWORD dwResult = WaitForSingleObject(m_hEvent, INFINITE);这句要等SetEvent(m_hEvent);

但是NavigateComplete2事件要等Get按钮的OnClick执行结束才会执行.于是互锁,永远等不到WAIT_OBJECT_0.



13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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