我在tthread对象中运行代码时遇到问题。如果网址包含“http://www.ebay.com/itm/”,它应该通过twebbrowser中的所有链接然后将其复制到备忘录中。代码在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的访问冲突
感谢阅读和所有回复。
答案 0 :(得分:1)
您的控件仍然具有GUI线程的无限性。因此,您无法从工作线程访问它。
您只需稍微调整线程设计即可实现此功能。处理页面的源代码以拉出GUI线程中的所有链接。这必须在那里完成,你别无选择。但是然后让工作线程进行链接的继续处理。我假设真正的应用程序更多地使用链接而不是将它们放在备忘录中!
您应该有一个简单的生产者/消费者设计。 GUI线程生成链接列表。工作线程消耗它们。线程安全队列将允许您在线程之间同步任务。并且您可能会受益于使用像OTL这样的更高级别的库而不是编写原始线程。