ホームページ >バックエンド開発 >C++ >Webbrowserコントロールドキュメントの完了前にスレッド終了を防ぐ方法は?

Webbrowserコントロールドキュメントの完了前にスレッド終了を防ぐ方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-02-01 21:13:18252ブラウズ

How to Prevent Thread Termination Before WebBrowser Control Document Completion?

別のスレッドでWebbrowserコントロールを作成

各URIの各URIから新しいウェブブラウザーコントロールを作成しようとする場合、一連のURLをクリックすると、問題が発生する可能性があります。つまり、ドキュメントが完全にロードされる前にスレッドが終了するため、ドキュメントコムプレタをトリガーすることはありません。イベント。

この問題を解決するには、メッセージサイクルをポンプで汲み上げるためにSTA(単一のスレッドユニット)スレッドを作成する必要があります。これにより、WebbrowserコントロールなどのActiveXコンポーネントに適した環境が提供されます。次の例コードは、これを達成する方法を示しています:

このコードでは、新しいSTAスレッドを作成し、変数Thに割り当てます。 setapartmentState()メソッドは、このスレッドがSTAスレッドになることを指定するために使用されます。その後、スレッドを起動し、BR(Webbrowser)インスタンスのNavigate()メソッドを呼び出して、必要なURLに移動します。最後に、DocumentCompletedイベント処理プログラムを登録し、Application.run()を使用してSTAスレッドのメッセージループを起動します。

ドキュメントがロードされると、browser_documentcompletedイベント処理プログラムが実行されます。ロードされたURLがターゲットURLと一致する場合、ナビゲーション情報がコンソールに印刷され、application.exitthread()を使用してスレッドを終了します。
<code class="language-csharp">private void runBrowserThread(Uri url) {
    var th = new Thread(() => {
        var br = new WebBrowser();
        br.DocumentCompleted += browser_DocumentCompleted;
        br.Navigate(url);
        Application.Run();
    });
    th.SetApartmentState(ApartmentState.STA);
    th.Start();
}

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var br = sender as WebBrowser;
    if (br.Url == e.Url) {
        Console.WriteLine("已导航到 {0}", e.Url);
        Application.ExitThread();   // 停止线程
    }
}</code>

以上がWebbrowserコントロールドキュメントの完了前にスレッド終了を防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。