トップ回答者
Thread作成すると重くなります。何か、対処方法はあるのでしょうか?

質問
-
お世話になっております。
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
回答
-
スレッドが重たいか否かは、作っている内容や話の着眼点によりますので、スレッド全般に対して言及できることはありません。
どういう処理を書いているかによりますが、上記の断片コードでは何もわかりません。
Do-Loop で全力でループするような処理(時間による待ち、同期オブジェクトなどによる待ちがないもの)であれば、CPU 使用率は上がると思いますが、それだけではタスクマネージャーでの CPU 使用率が高いだけで、フォームが固まるということはありません。
フォームが固まる(=GUI が応答しない)のであれば、Invoke や BeginInvoke を呼びまくっているのでは?基本的にスレッド側では Invoke/BeginInvoke を呼ぶ頻度や Invoke/BeginInvoke でメインスレッドに実行させる量を極力減らすことが必要になると思います。
- 編集済み AzuleanMVP, Moderator 2016年11月26日 7:29
- 回答としてマーク to1109 2016年11月26日 8:16
すべての返信
-
スレッドが重たいか否かは、作っている内容や話の着眼点によりますので、スレッド全般に対して言及できることはありません。
どういう処理を書いているかによりますが、上記の断片コードでは何もわかりません。
Do-Loop で全力でループするような処理(時間による待ち、同期オブジェクトなどによる待ちがないもの)であれば、CPU 使用率は上がると思いますが、それだけではタスクマネージャーでの CPU 使用率が高いだけで、フォームが固まるということはありません。
フォームが固まる(=GUI が応答しない)のであれば、Invoke や BeginInvoke を呼びまくっているのでは?基本的にスレッド側では Invoke/BeginInvoke を呼ぶ頻度や Invoke/BeginInvoke でメインスレッドに実行させる量を極力減らすことが必要になると思います。
- 編集済み AzuleanMVP, Moderator 2016年11月26日 7:29
- 回答としてマーク to1109 2016年11月26日 8:16