none
Thread作成すると重くなります。何か、対処方法はあるのでしょうか? RRS feed

  • 質問

  • お世話になっております。

    VB2008.NETを使用しています。

    通信を別スレッドで行わせるように改造したいと思っています。

    現状は、通信中はApplication.Eventsで処理させています。

    その場合は、軽快に動きますが

    通信量が多い場合に、ApplicationDoeventをさせていると

    通信時間にすごいばらつきがあり、改善したいです。

    ですが、別スレッドを起動すると

    メインフォームのコントロールの描画量が多いせいか、フォームが固まります。

    CPU負荷も25%以上になります。

    スレッドはかなり重い処理なのでしょうか?

    スレッドは毎回破棄しないとダメでしょうか?

    現状はDO-LOOPでずっと使おうと思っていますが

    設計的に問題でしょうか?

    情報が少なく申し訳ありませんが

    何か解決案をおもちでしたら、よろしくお願いします。

    ちなみに通信はイーサネット通信です。

    Sub New()        
    
    Dim test As System.Threading.Thread
     test = New Thread(New ThreadStart(AddressOf Threadtest))
    
    test.Start()
    
    End Sub
    
    
     Private Sub Threadtest()
    
            Do
    
            Loop
    
    
     End Sub
    
    

    2016年11月26日 4:17

回答

  • スレッドが重たいか否かは、作っている内容や話の着眼点によりますので、スレッド全般に対して言及できることはありません。

    どういう処理を書いているかによりますが、上記の断片コードでは何もわかりません。
    Do-Loop で全力でループするような処理(時間による待ち、同期オブジェクトなどによる待ちがないもの)であれば、CPU 使用率は上がると思いますが、それだけではタスクマネージャーでの CPU 使用率が高いだけで、フォームが固まるということはありません。
    フォームが固まる(=GUI が応答しない)のであれば、Invoke や BeginInvoke を呼びまくっているのでは?

    基本的にスレッド側では Invoke/BeginInvoke を呼ぶ頻度や Invoke/BeginInvoke でメインスレッドに実行させる量を極力減らすことが必要になると思います。

    2016年11月26日 7:19
    モデレータ

すべての返信

  • スレッドが重たいか否かは、作っている内容や話の着眼点によりますので、スレッド全般に対して言及できることはありません。

    どういう処理を書いているかによりますが、上記の断片コードでは何もわかりません。
    Do-Loop で全力でループするような処理(時間による待ち、同期オブジェクトなどによる待ちがないもの)であれば、CPU 使用率は上がると思いますが、それだけではタスクマネージャーでの CPU 使用率が高いだけで、フォームが固まるということはありません。
    フォームが固まる(=GUI が応答しない)のであれば、Invoke や BeginInvoke を呼びまくっているのでは?

    基本的にスレッド側では Invoke/BeginInvoke を呼ぶ頻度や Invoke/BeginInvoke でメインスレッドに実行させる量を極力減らすことが必要になると思います。

    2016年11月26日 7:19
    モデレータ
  • Azulean様

    ありがとうございます。

    DO-LOOPの負荷では、フォームに影響与える訳ないのですね。

    分かりました。

    僕も原理的におかしいと思っておりました。

    Invoke/BeginInvokeは書いておりません。

    そういう呼び出しは一切ありません。暗黙的には分かりませんが。。。

    ということは、どっかがおかしいってことですね。

    ありがとうございます。

    確認してみます。

    2016年11月26日 8:16