DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■33946 / inTopicNo.1)  スレッドのwebbrowserでDocumentCompletedが来ない
  
□投稿者/ 猫まっしぐら 一般人(3回)-(2018/08/03(Fri) 19:14:34)
  • アイコン環境/言語:[Windows7 VB.net2005] 
    分類:[.NET] 

    いつもお世話になっています
    
    ThreadWB = New Thread(New ThreadStart(AddressOf WBThread))
    ThreadWB.SetApartmentState(ApartmentState.STA)
    
    なスレッドの中で
    
    Private Sub WBThread()
        Do
            ' ここでキューを待機している
            Do While QWB.Count > 0
                RqsUrl = QWB.Dequeue
                If RqsURL <> "" AndAlso RqsURL <> "about:blank" Then
                    Using WB As New WebBrowser
                        WB.Visible = False
                        WB.ScriptErrorsSuppressed = True
                        AddHandler WB.DocumentCompleted, AddressOf WB_DocumentCompleted
                        Tim_WB.Start() ' このタイマーは処理終了のため
                        WB.Navigate(New Uri(RqsURL))
                        ' DummyLoop
                        For i As Integer = 0 To 100
                            Threading.Thread.Sleep(100)
                            Application.DoEvents()
                        Next
                        ' DummyLoopEnd
                        ' ここでタイマーからの終了の合図を待つ
                    End Using
                    System.GC.Collect()
                End If
            Loop
        Loop
    End Sub
    
    とやっているのですがこのダミーループ部分が無いとDocumentCompletedが発生しません
    Application.DoEvents無しでThread.Sleepだけでも発生しません
    10000回程ループを回せばApplication.DoEventsだけでも発生します
    なのでなるだけ少ないループで確実に発生させるためにこのような形になりました
    要はこのダミーループが回っているうちにDocumentCompletedが発生しないといけないようです
    
    Application.DoEventsはできれば使いたくないのですが他に何か方法はありますでしょうか
    

マルチポストを報告
違反を報告
引用返信 削除キー/
■33947 / inTopicNo.2)  Re[1]: スレッドのwebbrowserでDocumentCompletedが来ない
□投稿者/ Azulean 大御所(503回)-(2018/08/03(Fri) 22:38:54)
  • アイコンNo33946に返信(猫まっしぐらさんの記事)
    > このダミーループ部分が無いとDocumentCompletedが発生しません
    > Application.DoEvents無しでThread.Sleepだけでも発生しません

    WebBrowser はそれが属するスレッドでメッセージループが必要なコントロールです。
    Sleep だけだと誰もメッセージを処理しなくなるので、いつまで経っても完了しなくなります。

    > Application.DoEventsはできれば使いたくないのですが他に何か方法はありますでしょうか

    スレッドで作るのをやめるしかないと思われます。

    スレッドで WebBrowser コントロールのインスタンスを作成している背景・理由を明示してもらった方が有益な助言につながる可能性があります。
違反を報告
引用返信 削除キー/
■33948 / inTopicNo.3)  Re[2]: スレッドのwebbrowserでDocumentCompletedが来ない
□投稿者/ 猫まっしぐら 一般人(4回)-(2018/08/03(Fri) 23:50:51)
  • アイコンNo33947に返信(Azuleanさんの記事)
    返信ありがとうございます

    > WebBrowser はそれが属するスレッドでメッセージループが必要なコントロールです。
    > Sleep だけだと誰もメッセージを処理しなくなるので、いつまで経っても完了しなくなります。

    そういうことだったんですね

    > スレッドで WebBrowser コントロールのインスタンスを作成している背景・理由を明示してもらった方が有益な助言につながる可能性があります。

    スレッドにしているのは必要な時に随時インスタンスを生成、廃棄するためです
    (ループの中でキューで生成の合図を待ちタイマーで廃棄しています)

    廃棄するのはWebBrowserを使わない時には20MB程度のメモリ使用量なのですが
    使うと100-200MBにもなってしまうため、使い終わったらDisposeするために
    このような構成になりました

    …と思っていましたがスレッドの生成コストを嫌って使いまわしする癖がついてましたが
    この場合は(1時間に1回程度なので)都度スレッド使い捨ててもいいんですねえ…
    というかループ必要ないならスレッドにする必要も無いのかな?
    確認してみます

    ありがとうございました
解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -