4

我无法在 tthread 对象中运行我的代码。它应该遍历 twebbrowser 中的所有链接,然后如果 url 包含“http://www.ebay.com/itm/”,则将其复制到备忘录中。该代码在 mainform 中完美运行,但在 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 的访问冲突

感谢阅读和所有回复。

4

1 回答 1

1

您的控件仍然与 GUI 线程具有关联性。所以你不能从工作线程访问它。

您只需要对螺纹设计稍作调整即可完成这项工作。处理页面的源以提取 GUI 线程中的所有链接。这必须在那里完成,你别无选择。但是然后让工作线程对链接进行后续处理。我假设真正的应用程序对链接的作用比将它们放在备忘录中更多!

你应该有一个简单的生产者/消费者设计。GUI 线程产生一个链接列表。工作线程消耗它们。线程安全队列将允许您在线程之间同步任务。您可能会受益于使用 OTL 等更高级别的库而不是编码原始线程。

于 2013-01-26T16:54:50.033 回答