私はいくつかのバックグラウンドスレッドでたくさんのウェブブラウザを使おうとしています。これは、デザインビューのフォームに配置したWebブラウザーコントロールを使用する場合は問題ありませんが、実行時に作成される場合は問題ありません。
webbrowsers配列をグローバルに宣言します。
Dim webbroswers(-1) As WebBrowser
次のコードはメインスレッドにあります。
ReDim Preserve webbroswers(somenum)
For i = 0 To sumnum
webbroswers(currentbrowsermax + i) = New WebBrowser
Next
次に、このコードはバックグラウンドスレッドで実行されます。
If webbroswers(num).InvokeRequired Then
webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))
Else
webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))
この時点でプログラムがクラッシュし、次のエラーが発生します。
'WebBrowser'コントロールのウィンドウハンドルを取得できません。ウィンドウレスActiveXコントロールはサポートされていません。
これに関するどんな助けも素晴らしいでしょう。また、スクリプトエラーを抑制する方法を誰かが知っているなら、これが役立つかもしれないと思います。私は試しました:WebBrowser(num).ScriptErrorsSuppressed = Trueですが、これは機能しません(メインスレッドで実行している場合、コードの他の場所でも機能しません)ありがとうございます!
Control.InvokeRequiredメンバーとInvokeメンバーは、Handleプロパティを使用して、どのスレッドがコントロールを所有しているかを把握します。問題は、作成したWebブラウザーのハンドルがnullであるということです。コントロールは、フォームに表示した場合にのみ有効なハンドルを持ちます。あなたがしなかったこと。次に、ハンドルを作成しようとしますが、これは失敗したクジラです。WebBrowserのようなActiveXコントロールには有効な親が必要です。Me.Control.Add()がないと、元のバージョンで行われたように、Me.Control.Add()はありません。
回避策は簡単です。有効なHandleプロパティを持つ別のコントロールが必要です。ハンドルの値ではなく、ハンドルを所有するスレッドのみを考慮します。
あなたは1つを持っています:あなたのフォーム。代わりにMe.InvokeRequired
とMe.Invoke()
を使用してください。または、フォームオブジェクトへの参照を簡単に取得できない場合は、Application.OpenForms(0)を使用することをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加