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

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

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

Re[9]: Timer.Interval プロパティの制限について


(過去ログ 15 を表示中)

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

■4917 / inTopicNo.1)  Timer.Interval プロパティの制限について
  
□投稿者/ kazu (3回)-(2007/06/28(Thu) 18:53:50)

分類:[C# (Windows)] 

お世話になります。
System.Windows.Forms.Timer コンポーネントの Interval プロパティについて疑問があります。

開発環境: Visual Studio 2005 / .NET Framework 2.0

MSDN のテキストの『Windows フォームの Timer コンポーネントの Interval プロパティの制限』に、
System.Windows.Forms.Timer コンポーネントの Interval プロパティに設定できる値(間隔)の制限(1-64767)が明記されています。
http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx

ただ、実際にはそれ以上の値(System.Int32)を設定してコンパイルしてもエラーや警告が出ませんでしたし、
Interval プロパティの値を、900000(15分間隔)に設定して 24 時間置いてみても、
Interval プロパティの値毎に Tick イベントが実行されていました。(システムに重い負荷が掛かっていなかったことが前提ですが。)

これは、制限(1-64767)以上の値を設定もできるが動作の保証をしない等、他になんらかの理由があってのことなのでしょうか?
それとも、ただ単に私が MSDN のテキストのなにかしらを読み違えて誤解しているのでしょうか?

私の読み違えの様な気はしているのですが。。。
もしそうでしたら、申し訳ありません。無駄な質問お許しください。

引用返信 編集キー/
■4923 / inTopicNo.2)  Re[1]: Timer.Interval プロパティの制限について
□投稿者/ 渋木宏明(ひどり) (254回)-(2007/06/28(Thu) 20:18:02)
渋木宏明(ひどり) さんの Web サイト
> MSDN のテキストの『Windows フォームの Timer コンポーネントの Interval プロパティの制限』に、
> System.Windows.Forms.Timer コンポーネントの Interval プロパティに設定できる値(間隔)の制限(1-64767)が明記されています。
> http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx

より新しい版であるだろう、英語版の MSDN Library の記述は異なっています。
http://msdn2.microsoft.com/en-us/library/ms644906.aspx

> ただ、実際にはそれ以上の値(System.Int32)を設定してコンパイルしてもエラーや警告が出ませんでしたし、

普通に考えて、C/C++ のコンパイル時に値域外の値を設定していることを検出するのは無理ってもんです。

コンパイラの動作について、よく考えてみてください。

> これは、制限(1-64767)以上の値を設定もできるが動作の保証をしない等、他になんらかの理由があってのことなのでしょうか?

64767 という値自体は 16bit Windows の頃の名残りだと思います。

でも、より新しい版のヘルプに書かれている値域を守るべきです。

既定範囲外の値を使用した結果、何が起ころうともそれは自己責任です。

引用返信 編集キー/
■4947 / inTopicNo.3)  Re[2]: Timer.Interval プロパティの制限について
□投稿者/ kazu (4回)-(2007/06/29(Fri) 11:57:32)
渋木宏明(ひどり)さま、ご回答ありがとうございます。


> 普通に考えて、C/C++ のコンパイル時に値域外の値を設定していることを検出するのは無理ってもんです。
> コンパイラの動作について、よく考えてみてください。

いままで、コンパイラの動作というのものを理解しようとしていませんでした。
それなのに、エラーや警告が出ないと言ってしまっては、叱られても当然のことですね。
ご指摘くださりありがとうございます。


> 64767 という値自体は 16bit Windows の頃の名残りだと思います。

64767 という値についてのご考察に納得しました。

ただ、http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx に、
『This page is specific to Microsoft Visual Studio 2005/.NET Framework 2.0』とされていることを思うと、
釈然としません。。。

また、手元にある書籍ですが、表紙にマイクロソフト公式解説書と謳っている、『C# によるプログラミング Windows 上』(2002/07/15 発刊)の
302 ページのサンプルコードでは、Interval の値に、300000(5 * 60 * 1000)が設定されていたりするので、
より釈然としません。。。


> でも、より新しい版のヘルプに書かれている値域を守るべきです。
> 既定範囲外の値を使用した結果、何が起ころうともそれは自己責任です。

質問の場なので、恥を忍んでお伺いしたく思います。

新しい版のヘルプに書かれている値域を守るべきとのご指摘をくださいましたが、
今回の件、System.Windows.Forms.Timer コンポーネントの Interval プロパティ特有の制限かと思い質問しました。

ただ、System.Windows.Forms.Timer コンポーネント自体、Windows OS のタイマ・メッセージ(WM_TIMER メッセージ)をベースにしているとのことなので、
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDN のドキュメントの『Windows フォームの Timer コンポーネントの Interval プロパティの制限』はさておき、
http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx

『より新しい版であるだろう、英語版の MSDN Library の記述』を参考にし、それを守るべきなのでしょうか?
http://msdn2.microsoft.com/en-us/library/ms644906.aspx

引用返信 編集キー/
■4948 / inTopicNo.4)  Re[3]: Timer.Interval プロパティの制限について
□投稿者/ 渋木宏明(ひどり) (256回)-(2007/06/29(Fri) 12:08:48)
渋木宏明(ひどり) さんの Web サイト
2007/06/29(Fri) 12:33:24 編集(投稿者)

> いままで、コンパイラの動作というのものを理解しようとしていませんでした。
> それなのに、エラーや警告が出ないと言ってしまっては、叱られても当然のことですね。
> ご指摘くださりありがとうございます。

別に叱っちゃいません。
注意を喚起しただけのつもりです。

> 新しい版のヘルプに書かれている値域を守るべきとのご指摘をくださいましたが、
> 今回の件、System.Windows.Forms.Timer コンポーネントの Interval プロパティ特有の制限かと思い質問しました。
>
> ただ、System.Windows.Forms.Timer コンポーネント自体、Windows OS のタイマ・メッセージ(WM_TIMER メッセージ)をベースにしているとのことなので、
> http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html
>
> MSDN のドキュメントの『Windows フォームの Timer コンポーネントの Interval プロパティの制限』はさておき、
> http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx
>
> 『より新しい版であるだろう、英語版の MSDN Library の記述』を参考にし、それを守るべきなのでしょうか?
> http://msdn2.microsoft.com/en-us/library/ms644906.aspx

「何を守るべきか」の既定があるわけではないので、最終的にはお好きなように。

SetTimer() のヘルプトピックの最大値がいくつかはまだ調べていませんが、個人的には、安全方向に倒すことを重視するので、最大値として示されている「より小さいほうの値」を最大値として扱うと思います。

でも、おそらくそんな値を調べることは今後も無さそうです。

数分以上の間隔があるならば、自分ならタイマーではなく時刻監視かタスクマネージャを使うので。

引用返信 編集キー/
■4954 / inTopicNo.5)  Re[4]: Timer.Interval プロパティの制限について
□投稿者/ kazu (5回)-(2007/06/29(Fri) 13:30:02)
渋木宏明(ひどり)さま、ご回答ありがとうございます。


> 「何を守るべきか」の既定があるわけではないので、最終的にはお好きなように。

質問の場において、『MSDN のドキュメントを読んで調べろ』云々の言葉をよく見聞きするので、

MSDN のドキュメントの『Windows フォームの Timer コンポーネントの Interval プロパティの制限』の、
『設定できる間隔は 1 から 64,767 までです。つまり、間隔は最大でも 1 分強 (約 64.8 秒) です。』の説明をひとつの規定だと思ってしまいました。
http://msdn2.microsoft.com/ja-jp/library/xy0zeach(VS.80).aspx

こういったドキュメントも含め、『何を守るべきか』は自己判断によるのですね。


> SetTimer() のヘルプトピックの最大値がいくつかはまだ調べていませんが、個人的には、安全方向に倒すことを重視するので、最大値として示されている「より小さいほうの値」を最大値として扱うと思います。
> でも、おそらくそんな値を調べることは今後も無さそうです。
> 数分以上の間隔があるならば、自分ならタイマーではなく時刻監視かタスクマネージャを使うので。

突き放さずに、的確なアドバイスをくださいましてありがとうございます。
今後の参考にさせていただきたく思います。


> 別に叱っちゃいません。
> 注意を喚起しただけのつもりです。

言い回しが悪く申し訳ありませんでした。。。
私の方もご指摘をいただいたものと思っております。


これで解決済みにしようかと思いましたが、
今回の件、ただ単に 16bit Windows の頃の名残りとして MSDN のドキュメントにそう説明してあるのか、
動作の保証をしない等、他になんらかの理由があってのことなのか、
いまひとつ釈然としないので、もうしばらくこの場をお借りしたく思います。

引用返信 編集キー/
■4955 / inTopicNo.6)  Re[5]: Timer.Interval プロパティの制限について
□投稿者/ 渋木宏明(ひどり) (257回)-(2007/06/29(Fri) 13:39:47)
渋木宏明(ひどり) さんの Web サイト
> こういったドキュメントも含め、『何を守るべきか』は自己判断によるのですね。

MSDN Library もそのすべてが正しいわけではないですからね。
オリジナルの英語版でも稀に誤記が見られますし、日本語版ではそれに加えて誤訳もチラホラも見られます。

心配なら、MS のサポートに問い合わせるという手もありますが、面倒なので余程のことが無い限り僕は自分で判断してます。
サポートの回答をあてにして失敗しても、サポートはその責任まで被ってくれませんから。

>>数分以上の間隔があるならば、自分ならタイマーではなく時刻監視かタスクマネージャを使うので。

「タスクマネージャ」→「タスクスケジューラ」でした。

> 今回の件、ただ単に 16bit Windows の頃の名残りとして MSDN のドキュメントにそう説明してあるのか、
> 動作の保証をしない等、他になんらかの理由があってのことなのか、

まったくの勘ですが、それほど特別な理由はなさそうですけどねぇ。

実際には 32bit 値で指定できる範囲で異常なく動作してしまうのかもしれませんが、「自分の環境」でだけ確認した動作をどこまで信用するかは自分で判断するしかありません。

それに、決め事なんで、理由を知ったところでどうするの?という気もします。

ドキュメントでの規定外の動作はOSのバージョンが変わると、ガラッと変わる可能性もありますので、僕は引き続きドキュメントの範囲内での使用を推奨しておきます。

引用返信 編集キー/
■4977 / inTopicNo.7)  Re[6]: Timer.Interval プロパティの制限について
□投稿者/ kazu (6回)-(2007/06/29(Fri) 18:12:02)
2007/06/29(Fri) 18:46:16 編集(投稿者)

渋木宏明(ひどり)さま、ご回答ありがとうございます。


今回の件ですが、自分で判断するしかないというのが、ひとつの答えになるのでしょうか。
いただいたアドバイスを基に割り切って考えれば、それはそれで釈然としたような気がします。

MSDN Library に対してのスタンスも含めて、いろいろとアドバイスをくださりありがとうございます。
今回いただきましたご指摘、アドバイスを今後に役立てたいと思います。

ご教示ありがとうございました。

解決済み
引用返信 編集キー/
■4991 / inTopicNo.8)  Re[7]: Timer.Interval プロパティの制限について
□投稿者/ 渋木宏明(ひどり) (258回)-(2007/07/01(Sun) 10:49:29)
渋木宏明(ひどり) さんの Web サイト
> 今回の件ですが、自分で判断するしかないというのが、ひとつの答えになるのでしょうか。

他に責任を持って判断してくれる誰かがいれば別ですが、普通はいないですよね。

サポートに問い合わせて確認してみる、というのももちろんアリだと思いますが、個人的にはそれも数ある情報源の1つに過ぎないと考えています。

それに、最終成果物に対して自分が責任を負っているのであれば、どの情報を採用するかは自分で決めた方がスッキリするんじゃないかと思います。
引用返信 編集キー/
■5107 / inTopicNo.9)  Re[8]: Timer.Interval プロパティの制限について
□投稿者/ れい (1回)-(2007/07/04(Wed) 15:22:05)

Timerの64767制限は確かVB4の制限だったと思います。
VB5で消えたはずです。

System.Windows.Forms.Timerは
Win32のSetTimerを呼んで時間を計っていますが、
SetTimerの最大値は0x7fffffffですので、
Integer型のSystem.Windows.Forms.Timer.Intervalプロパティを経由すれば
最大値を超えることはありえません。

>システムが時刻を生成するのは毎秒 18 回です

これも昔(ISAな割込みを使ってた時)は18.2回でしたが、
今はこの制限はありません。
OSが10ms未満のイベント発生を止めていますので、
10ms(毎秒100回)が限界になります。

というのが私の見解で、
MSDNの記述はただの不備だと思っています。
ご参考までに。

>より新しい版であるだろう、英語版の MSDN Library の記述は異なっています。
>http://msdn2.microsoft.com/en-us/library/ms644906.aspx

日本語に対応する以下のページにはまだ64767制限が書かれています。

http://msdn2.microsoft.com/en-us/library/xy0zeach(VS.80).aspx

MSDNは最終更新日時が書いてないのでどれが最新かわかりませんね。

引用返信 編集キー/
■5158 / inTopicNo.10)  Re[9]: Timer.Interval プロパティの制限について
□投稿者/ kazu (7回)-(2007/07/05(Thu) 17:50:25)
2007/07/05(Thu) 18:09:59 編集(投稿者)

渋木宏明(ひどり)さま、れいさま、引き続きのご回答ありがとうございます。
解決済みとさせていただきました後でのこともあって、返信および御礼が遅くなってしまいました。申し訳ございません。。。

渋木宏明(ひどり)さまのお言葉通り、自分で決めた方がスッキリするかと思いますし、
いまさらながらに思えば、いまままでにもそうせざるを得ないようなことが多々あったように思います。
今回そうするにあたりまして、渋木宏明(ひどり)さまからのご回答はもちろんのこと、
れいさまからいただきましたご回答がたいへん参考になりました。

お二方ともに、ご回答ありがとうございました。
今後ともご教示の程、よろしくお願いいたします。

それでは。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -