C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: タイマーのズレ


(過去ログ 134 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■79071 / inTopicNo.1)  タイマーのズレ
  
□投稿者/ さくらとあおい (3回)-(2016/03/05(Sat) 08:50:55)

分類:[VB.NET/VB2005 以降] 

現在、PicrureBoxを使って、グラフをスクロールさせています。

タイマーを使って、例えば200msec毎に1ページ分のグラフを書いて、
更新させていくやり方をしています。

タイマーの1回1回の精度は気にしていないのですが、波形が1画面分スクロールした時に、
例えば12秒とすると、12秒前後になるのはかまわないですが、常に12秒をオーバーし、
時間が積算されます。タイマーはこのような物なのか?、それとも使い方が悪いのでしょうか?

【グラフの内容】
横:600ドット
タイマー:200msec or 1000msec
表示タイミング:タイマー毎に10ドット分スクロールしたグラフを描画

1画面分スクロールだと600/10=60回となり、200msecや1000msecのタイマーだと
12秒や60秒の時間になると思いますが、毎回少し長い時間になります。

画面1枚分を描画した時に、PCの時間を秒以下まで表示させた時の
結果を添付します。200msecと1000msecの時間差がほぼ5倍です。
(200msec:12.168秒 → 1000msec:60.84秒)


【タイマー1000msecの結果】
分	秒	小数点	合計	時間差
1	3	644	63.644	
2	4	483	124.483	60.839
3	5	324	185.324	60.841
4	6	163	246.163	60.839
5	7	4	307.004	60.841
6	7	844	367.844	60.84
7	8	685	428.685	60.841
8	9	526	489.526	60.841
9	10	367	550.367	60.841

【タイマー200msecの結果】
分	秒	小数点	合計	時間差
10	13	718	613.718	
10	25	886	625.886	12.168
10	38	54	638.054	12.168
10	50	222	650.222	12.168
11	2	392	662.392	12.17
11	14	559	674.559	12.167
11	26	726	686.726	12.167
11	38	894	698.894	12.168

引用返信 編集キー/
■79078 / inTopicNo.2)  Re[1]: タイマーのズレ
□投稿者/ 774RR (382回)-(2016/03/06(Sun) 16:12:23)
一口でタイマーと言っても .NET Framework の提供するタイマーは
System.Threading.Timer
System.Timers.Timer
System.Windows.Forms.Timer
と複数種類ある。どれを使っているのだろう?

Forms.Timer は UI スレッド上で動作し、タイマーイベントの優先順は低いので、
タイマーイベントハンドラーの中で重い動作をさせるとどんどん遅延していく。
イベントハンドラの中では invalidate するくらいに留めておくとよいだろう。

ほかのタイマーはスレッドプール上で動作するので画面の更新などに使うには
スレッドをまたがる考慮が必要。

引用返信 編集キー/
■79079 / inTopicNo.3)  Re[1]: タイマーのズレ
□投稿者/ Azulean (609回)-(2016/03/06(Sun) 22:52:46)
No79071 (さくらとあおい さん) に返信
> タイマーの1回1回の精度は気にしていないのですが、波形が1画面分スクロールした時に、
> 例えば12秒とすると、12秒前後になるのはかまわないですが、常に12秒をオーバーし、
> 時間が積算されます。タイマーはこのような物なのか?、それとも使い方が悪いのでしょうか?

System.Windows.Forms.Timer は「指定した時間以上経過したタイミングでの発生」であり、「前」になることはありません。
また、すでに指摘されているようにメインスレッドの負荷具合によっては、Interval 到達からの遅延が大きくなることはあります。


平均して Interval 程度に保ちたいとなると、それなりに作る難易度は上がります。
(スレッドが絡んでくると思われるため)
引用返信 編集キー/
■79081 / inTopicNo.4)  Re[1]: タイマーのズレ
□投稿者/ shu (827回)-(2016/03/07(Mon) 07:26:14)
No79071 (さくらとあおい さん) に返信

グラフにしているデータはどのようなものなのでしょうか?
そのデータには時間情報とその時間での値が組になっているので
でしょうか?
タイマ発生時の正確な時間を渡して値を取得しているようなら
それをやめて例えばタイマ発生回数を基に取得する時間を決めるとか
出来ないのでしょうか?
例)タイマ発生1回目は1秒のデータ、2回目は2秒のデータのように
 するなど。
引用返信 編集キー/
■79085 / inTopicNo.5)  Re[2]: タイマーのズレ
□投稿者/ さくらとあおい (5回)-(2016/03/07(Mon) 08:39:58)
No79078 (774RR さん) に返信
> 一口でタイマーと言っても .NET Framework の提供するタイマーは
> System.Threading.Timer
> System.Timers.Timer
> System.Windows.Forms.Timer
> と複数種類ある。どれを使っているのだろう?

System.Windows.Forms.Timerになります。
タイマー発生時に画面描画していますので、ご指摘の動作になっている感じですね。
タイマー発生時の処理に関係なく、常に一定の時間でタイマーが発生するのではなく、
タイマーイベント終了後から、タイマーカウントがスタートするという事でしょうか?

引用返信 編集キー/
■79086 / inTopicNo.6)  Re[2]: タイマーのズレ
□投稿者/ さくらとあおい (6回)-(2016/03/07(Mon) 08:47:42)
No79079 (Azulean さん) に返信

> System.Windows.Forms.Timer は「指定した時間以上経過したタイミングでの発生」であり、「前」になることはありません。
> また、すでに指摘されているようにメインスレッドの負荷具合によっては、Interval 到達からの遅延が大きくなることはあります。
>
>
> 平均して Interval 程度に保ちたいとなると、それなりに作る難易度は上がります。
> (スレッドが絡んでくると思われるため)

順番に回答している為、774RRさんに再質問してしまいましたが、頂いた回答で納得しました。
組込みマイコンのインターバルタイマーをイメージしていました。

組込みマイコンのデータを受信して、グラフを表示させますので、データが一定の数になったら画面更新させるか、
データ受信よりも画面更新を多くするの、どちらかでデータ抜けが無い様に考えます。
引用返信 編集キー/
■79087 / inTopicNo.7)  Re[2]: タイマーのズレ
□投稿者/ さくらとあおい (7回)-(2016/03/07(Mon) 08:53:30)
No79081 (shu さん) に返信

> グラフにしているデータはどのようなものなのでしょうか?

最終的に作りたいグラフは、組込みマイコンから通信するセンサー等の
データになります。
VB初心者なので、タイマー更新でグラフのスクロールをさせたのですが、
波形1画面分更新させた時に、期待通りの時間になるのは、タイマー値を
どこまで小さくできるかを確認する為に、行いましたが、皆様の回答で
なんとなくですが、理解できた気がします。
今回、時間のズレを説明する為に、秒以下の値を計測しましたが、
正確な時間を使ったりはしないです。



引用返信 編集キー/
■79088 / inTopicNo.8)  Re[3]: タイマーのズレ
□投稿者/ さくらとあおい (8回)-(2016/03/07(Mon) 08:56:36)
この掲示板を始めて使いましたので、解決済みの使い方が
分かりませんでしたので自分のコメントに解決済みを入れますが、
皆様の回答のおかげで、少しですが、System.Windows.Forms.Timerの
イメージができた気がします。

また何かございましたらよろしくお願いします。
解決済み
引用返信 編集キー/
■79095 / inTopicNo.9)  Re[4]: タイマーのズレ
□投稿者/ 774RR (384回)-(2016/03/07(Mon) 14:22:15)
System.Windows.Forms.Timer は WM_TIMER で実装されているので次の動作となる。

1.WM_TIMER は他のイベントより優先順位が低い (ほぼ最低レベル)
他の UI イベント処理がいっぱいあるとサービスされるタイミングはずれてしまう
2.1回目の WM_TIMER が処理されないまま (UI スレッドが忙しい等の理由により)
2回目の WM_TIMER が Post/Send されると、1つにまとめられてしまう。
3.WM_TIMER の精度は 1msec 無い。では具体的にどの程度の精度があるかはマシン/OS 次第。
太古の Win95 世代マシンでは 55msec などといわれている。
現代の Win7/8/10 での調査はしていないが 10msec 程度と個人的に思う。
4.メッセージは UI スレッドで同期的に処理されるので GUI 更新には使いやすい。

たとえば Tick=500msec としたとき UI イベントの1つが 3000msec を要してしまうと
500->500->3350->150->500-> のような周期で処理されることになる。
(3000msec 中に発生した全てのタイマーイベントは1つにまとめられてしまう)

タイマーイベント自体の処理に 750msec を要してしまうと
750->750->750-> のような周期で処理される (同期的とはそういうこと)

当該デバイスが USB の HID であればハードウエアレベルで Transaction Interval が管理されているので
データを特定個数回収したら画面更新で、かなり正確に時間が得られそうな希ガス

引用返信 編集キー/
■79096 / inTopicNo.10)  Re[3]: タイマーのズレ
□投稿者/ shu (830回)-(2016/03/07(Mon) 14:31:46)
No79087 (さくらとあおい さん) に返信
> ■No79081 (shu さん) に返信
>
>>グラフにしているデータはどのようなものなのでしょうか?
>
> 最終的に作りたいグラフは、組込みマイコンから通信するセンサー等の
> データになります。
> VB初心者なので、タイマー更新でグラフのスクロールをさせたのですが、
> 波形1画面分更新させた時に、期待通りの時間になるのは、タイマー値を
> どこまで小さくできるかを確認する為に、行いましたが、皆様の回答で
> なんとなくですが、理解できた気がします。
> 今回、時間のズレを説明する為に、秒以下の値を計測しましたが、
> 正確な時間を使ったりはしないです。
>
送られてくるデータに時間に関する情報が含まれているのではないでしょうか?
という事なのです。データを貰う方の時間で処理してしまうと通信ラグの
影響が大きくなりがちです。データ作成側の持っている時間を使えば
Timerのズレとか気にする必要はないかと思います。



引用返信 編集キー/
■79108 / inTopicNo.11)  Re[5]: タイマーのズレ
□投稿者/ さくらとあおい (10回)-(2016/03/08(Tue) 11:18:14)
No79095 (774RR さん) に返信

System.Windows.Forms.Timerの説明ありがとうございます。
全て理解できてませんが、留意して使います。

タイマーの件は、VBでグラフを試しに作る事からスタートして
素朴な疑問として出てきました。
実際に作るグラフとしては、時間を気にするよりかは、
通信データの取りこぼしが無いようなグラフを製作したいと思ってます。

組込みマイコンの10msecや100msec間隔で、データを送りますので、
基本的には、この時間に応じた更新タイミングにした方が良い気がしています。

解決済み
引用返信 編集キー/
■79109 / inTopicNo.12)  Re[4]: タイマーのズレ
□投稿者/ さくらとあおい (11回)-(2016/03/08(Tue) 11:23:17)
No79096 (shu さん) に返信

マイコン側から送るデータはセンサーの値等になりますので
直接時間を送る事は考えてませんが、基本的に10msec毎か
100msec毎にデータを送る事になりますので、
通信データがある数になったら、スクロールさせる様に
しようかと思います。

VBを使って、初めてソフトを作りますので、
通信機能とグラフ機能をそれぞれ別々に作成していますので、
グラフでスクロールさせる時にタイマーを使って
疑問が出てきた次第です。

マイコン側をマスター的に位置付けてますので、
フォームのタイマーが完全に正確でも、きっちりした同期はできないのは
認識しています。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -