質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

解決済

2回答

8282閲覧

C# マルチスレッドのスレッド数

x__x

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

0クリップ

投稿2017/02/22 05:15

###前提・実現したいこと
C#にてマルチスレッドのアプリケーションを開発しています。
マルチスレッドのスレッド数の設定について教えていただきたいとことがあります。

既にあるアプリケーションに対して、スレッド追加をしたところ、コンテキストニューが表示されなくなりました。
最適な、スレッド数の確認方法と、設定方法をご教授いただけると助かります。

また、スレッド数を増やすことが、必須となる場合、全体的に処理速度を落として、
平均化させる様な方法はありますでしょうか?

###発生している問題・エラーメッセージ

複数の機器相手に、状態監視をおこなうアプリケーションです。
相手機器とのやり取りは、なるべく高速におこなう必要があり、
機器ごとに、スレッドが立ち上がり、無限ループしている状態です。
自分が作成しているモジュール以外でもスレッドを立ち上げているため、
全体のスレッド数は、把握できていません。

このアプリケーションはフォームがひとつあり、起動後、タスクトレイに格納されます。
タスクトレイのアイコンをクリックするとコンテキストメニューで、メニューが表示されます。

正常に動作するアプリケーションに対して、今回、4つのスレッド追加したところ、
コンテキストメニューが表示されなくなりました。
時間が経過すれば、表示はされますが、反応はしないです。

###該当のソースコード

下記コードにて、2つの機器に対して、2つのスレッドを追加しています。 ThreadType●Conditionは、状態をチェックし、thType●Collectは、データを取得するスレッドです。 Thread thTypeACondition = new Thread(new ParameterizedThreadStart(ThreadTypeACondition)); thTypeACondition.Start(obj); Thread thTypeACollect = new Thread(new ParameterizedThreadStart(ThreadTypeACollect)); thTypeACollect.Start(obj); Thread thTypeBCondition = new Thread(new ParameterizedThreadStart(ThreadTypeBCondition)); thTypeBCondition.Start(obj); Thread thTypeBCollect = new Thread(new ParameterizedThreadStart(ThreadTypeBCollect)); thTypeBCollect.Start(obj);

###試したこと

・ThreadType●Conditionのスレッドをコメントすると、コンテキストメニューが表示されるようになります。
・ThreadType●Conditionのコメントをなくして、Thread.Sleepを追加してみましたが、
コンテキストメニューは表示されなくなります。
・ThreadPool.SetMinThreadsで、最低スレッド数を多くしてみましたが、
コンテキストメニューは表示されません。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

OS: Windows7 (64bit)
CPU: Core i5
RAM: 8GByte

Visual Studio 2015 Express for Desktop

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/02/22 07:48

ちょっとした興味なんですが、監視対象のデバイスとは何で通信しているんですか?シリアルポート?
x__x

2017/02/22 07:58

Ethernetです。
guest

回答2

0

ベストアンサー

thTypeACondition.IsBackground = true;
とバックグランドスレッドにしても同様でしょうか?

また、本文を読むとスレッド数というよりThreadType●Condition内の処理の問題にも取れるのですが
ThreadType●Conditionを1つだけ追加した場合は表示されるのでしょうか?

投稿2017/02/22 05:33

編集2017/02/22 05:39
YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x__x

2017/02/22 05:54

返答ありがとうございます。 >> thTypeACondition.IsBackground = true; を追加してみましたが、症状は改善しませんでした。 確かに、thType●Collectは、そのまま実行させても問題なく動作しますので、 今回の問題には影響していないと思います。 ThreadType●Conditionの方をコメントすることで、正常に動作するようになりますので、 こちらの関数の処理の問題である可能性が高いとは思っております。 こちらの関数は、無限ループしている中で、処理をシーケンシャルにおこなっています。 1回のループも数ミリで処理が完了しているため、 負荷を減らす方法があれば、改善するのではないかと考えておりました。
YAmaGNZ

2017/02/22 06:14

ThreadPool.SetMinThreadsはThreadPoolで管理するThread数のことなので、今回のようにThreadPoolを使わない場合には関係がありません。 ThreadType●Conditionの内部処理についてですが、下記のようなループ内に他のスレッドへ処理を切り替えるようなものは入っているのでしょうか? while(true) {   // 処理1   // 処理2   // 処理3   Thread.sleep(0); }
x__x

2017/02/22 07:34

>> ThreadPool.SetMinThreadsはThreadPoolで管理するThread数のことなので、今回のようにThreadPoolを使わない場合には関係がありません。 そうなんですね。 相手機器からのコマンドを取り出す処理を組んでありますが、スレッドが分かれている訳ではありません。 問題の処理について、コメントしながらデバッグしたところ、問題らしき箇所は、 見つけることができました。 記載いただいた処理1、処理2、処理3はそれぞれ、同じ構成です。 ひとつの関数の中で、以下、2つの処理があります。 ・送信用データバッファの空き状況を確認して、アスキーコードをセット つづけて、 ・受信用バッファにデータがセットされているかをチェックして、取り出す このデータバッファは、別のモジュールでも、参照して、データのリード、ライトをおこなっていますが、お互いにデータ有無しか判断しておらず、存在しなければ、 次のループでチェックするだけなので、処理待ちなどの動きはありません。 デバッグで、受信側をすべてコメントしても、メニューは表示されませんでしたが、 送信側のアスキーコードをセットするコードがひとつでも存在すると、メニューは表示されません。 シンプルに、送信側のアスキーコードをセットするところだけでも、メニューが出なくなりますが、 ジャグ配列が影響しているなんてこと・・・ありませんよね?
hmmm

2017/02/22 07:48

@x__x コンテキストメニューが表示されないというのはUIスレッドが動作していない・反応が悪いのだと思います。高負荷でないのであれば、「送信側のアスキーコードをセットする」処理がロックの獲得とかでUIスレッドとバッティングして軽いデッドロック状態になってはいないでしょうか?
YAmaGNZ

2017/02/22 08:01

聞いている限り、バックグラウンドスレッドにしておけば問題なさそうに感じます。 そのスレッドからInvokeしたりして、結局UIスレッドで動いていたりとかはないでしょうか?
x__x

2017/02/22 08:20

ありがとうございます。 再度、見直して必要があれば、再投稿するようにいたします。 何度も、お手数をおかけしました。
guest

0

機器ごとに、スレッドが立ち上がり、無限ループしている状態です

コンテキストメニューが表示されなくなりました。
時間が経過すれば、表示はされますが、反応はしないです。

CPU負荷やメモリ使用量が高すぎるとかじゃないでしょうか?
とりあえず現在のスレッド数とCPU使用率をタスクマネージャーなどで確認してみてはいかがでしょうか。
無意味な無限ループでCPU負荷が高くなっているのではと思えます。

投稿2017/02/22 06:30

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x__x

2017/02/22 07:35

ありがとうございます。 負荷を確認しましたが、10~50%ぐらいで推移しており、特別、負荷が高いというわけでもなさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問