Delphi中的WebBrowser如何在TThread对象中获取所有链接

4

我可以帮助您进行翻译。

我在tthread对象中运行代码时遇到了问题。它应该遍历twebbrowser中的所有链接,如果url包含'http://www.ebay.com/itm/',则将其复制到备忘录中。该代码在主窗体中完美运行,但在tthread对象中不起作用。

我的代码:

begin
  count := 0;
   loop := 0;
    repeat
    link := Webbrowser1.OleObject.Document.Links.Item(loop).href;
     if AnsiContainsStr(link, 'http://www.ebay.com/itm/') then
    begin
     Form1.Memo1.Lines.Add(link);
    end;

  end;

     loop := loop + 1;
    count := count + 1;
  until count = Webbrowser1.OleObject.Document.links.Length;
end;

我遇到的错误信息如下:

在 mshtml.dll 模块中,访问地址 xxxxxx 时发生访问冲突。

感谢阅读并期待回复。


5
你不能直接从一个线程更新主表单控件。我建议你阅读有关Delphi中的多线程基础知识(https://www.google.com/search?q=multithreading+in+Delphi),尤其是Martin Harvey的教程http://tabasco.torreingenieria.unam.mx/gch/Threads%20en%20delphi/ToC.html。 - Jan Doggen
1个回答

1

您的控件仍然与GUI线程相关联。因此,您无法从工作线程访问它。

您只需要稍微调整线程设计即可使其正常工作。处理页面源以删除GUI线程中的所有链接。必须在那里完成,您别无选择。但是,让工作线程继续处理链接。我假设真实应用程序对链接的操作不仅仅是将它们放入一个备忘录中!

您应该拥有一个简单的生产者/消费者设计。GUI线程生成链接列表。工作线程消耗它们。线程安全队列将允许您在线程之间同步任务。并且使用高级库(如OTL)可能比编写原始线程更有益。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接