4

tthreadオブジェクトでコードを実行するのに問題があります。URLに「http://www.ebay.com/itm/」が含まれている場合は、twebbrowserのすべてのリンクを調べて、メモにコピーすることになっています。コードはメインフォームでは完全に機能しますが、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 に答える