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

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

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

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

Q&A

解決済

1回答

4461閲覧

C#のTimer設定と処理速度

ParaParaDance

総合スコア56

C#

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

0グッド

0クリップ

投稿2020/05/14 07:44

[ 動作環境 ]
・PCとUSBで繋がった通信機器のデータ受信API関数を、C#のTimerで回し、データを貰い、PCに表示させている。

・C# Timer周期のパラメタは 1に設定。(1ms)

・外部から入ってくるデータは、15ms周期

[ 発生現象 ]
PCとUSBで繋がった通信機器の受信Queueを見ると、受信を処理しきれず、Queueにデータがどんどん溜まり、データが詰まってしまう。

[ 質問 ]
1.C# Timerは1ms周期なので、1msの速度で処理されるのかと思いましたが違うでしょうか。
外部からのデータの周期を遅くすると、データ詰まりがなくなります。

2.処理速度を上げて、Queueにデータが溜まらないようにしたいですが、どこを改善すればよいでしょうか
1.USB速度の問題
2.Windowsの問題(Windows Form Applicationです。)
3.その他の原因

宜しくお願いします。

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

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

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

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

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

ozwk

2020/05/14 07:57 編集

PCでの受信データを処理する時間は測定しましたか?
YAmaGNZ

2020/05/14 08:08

受信時には1セットのデータ(15ms周期で送信される一塊)しか受信していないのでしょうか?
ParaParaDance

2020/05/14 08:12

ozwk>> すみません。PCでの受信データを処理する時間は、どうやって測定できるのでしょうか。 YAmaGNZ>> 今のところ、1対1の通信で検証しています。
退会済みユーザー

退会済みユーザー

2020/05/14 08:13

溜まるってことは、タイマー周期でキューにあるデータ全部処理してない可能性はありそうですね
ParaParaDance

2020/05/14 08:16

radian>> Timerを1msで回せば、通信機器からPCへのデータ渡しも1msで行われるかと考えました。何が問題ですかね。
YAmaGNZ

2020/05/14 08:18

1対1とは1つのPCに1つのUSB機器ということですか? もしそういう意味での返答でしたら、私が聞きたかったことと異なります。 例えば、タイマーイベントが30ms間隔で起こったとします。 そうすると、USB機器は15ms間隔でのデータ送信ですので、2回分のデータが受信待ちとなっているはずです。 この時、タイマーイベントでの受信処理で1回分のデータしか受信していないのかどうかを聞きたかったのです。 もしそうなのであれば、2回分受信してしまえば、キューには溜まらないのではないでしょうか?
YAmaGNZ

2020/05/14 08:22

実際にどのようなデータかは存じませんので、時間的な要素が重要なものであった場合は、タイマー間隔で受信バッファにあるだけ受信するという方法が適切ではない可能性もありますので、そのあたりはご自身で検討してください。
ParaParaDance

2020/05/14 08:26

15ms周期の一つのデータしか送られてません。 従って1msのTime Eventであれば、データがはけるはずだと思いましたが、何故かQueが溜まります。
YAmaGNZ

2020/05/14 08:33

送信側ではなく、受信側の話です。 タイマーに関しては他の方が回答していらっしゃるとおり1msでの動作は保障されません。 ですので、Inervalを1msと設定しても実際にはそれより長い間隔でタイマーイベントが発生します。 そこで、15ms周期で1つのデータを送信したら、受信側が30ms周期だった場合は「2つデータが溜まります」よね? そこで、タイマーイベントにて1つのデータしか受信しない場合、1つのデータが溜まります。 次にタイマーイベントが発生するのが30ms後ですから、次のイベント時には3つのデータがあることになります。 このように繰り返すとどんどんデータが溜まりますので、イベント時にまとめて受信しましょうという話です。
guest

回答1

0

ベストアンサー

Timerオブジェクトは何種類かありますが、1msの精度は保証されていないので(内部でSetTimer使ってる奴は特に遅い)、高速に処理するなら、ひたすらループを回すようなTaskを起動したほうがよいでしょう。

C#

1 private void Button1_Click(object sender, RoutedEventArgs e) 2 { 3 //タスク起動 4 Task t = Task.Run(ReadTask); 5 } 6 7 private void ReadTask() 8 { 9 while(true) 10 { 11 //なんかの処理をする 12 13 //1ms 待機 14 System.Threading.Thread.Sleep(1); 15 } 16 }

サンプルは適当なコードなので、あくまでイメージ程度に考えてください。
Taskのキャンセルは、解説してるページ色々あるのでWeb検索してみた方がいいと思います。

投稿2020/05/14 07:58

編集2020/05/14 07:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問