- PR -

VB6.0 タイマーコントロールの『.Interval = 0』の使用上の注意について

投稿者投稿内容
Neverland
ベテラン
会議室デビュー日: 2006/11/27
投稿数: 56
投稿日時: 2007-11-08 10:37
どなたかご教授ください。

VB6.0 で「タイマーコントロール」を使用する時のことです。

タイマーのイベントを破棄(未使用にする(二重起動防止))する場合にプロパティで、『.Interval = 0』だけでは何故だかもう一度イベントが発生した様な記憶があり、何かで調べた結果、『.Interval = 0』と共に『.Enabled = False』をペアにしてコーディングをする様になりました。(この「何か」を忘れています)

いわゆる「おまじない」的なことだったかも知れませんが、社内にこのことを知らせたいと思っており、そのために、このことを正式?に推奨する様なページ等がどこかにありませんでしょうか?

そもそも、この理解(使用)の仕方が間違っている場合はご指摘ください。

よろしくお願いいたします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-11-08 10:49
引用:

Neverlandさんの書き込み (2007-11-08 10:37) より:
どなたかご教授ください。

VB6.0 で「タイマーコントロール」を使用する時のことです。

タイマーのイベントを破棄(未使用にする(二重起動防止))する場合にプロパティで、『.Interval = 0』だけでは何故だかもう一度イベントが発生した様な記憶があり、何かで調べた結果、『.Interval = 0』と共に『.Enabled = False』をペアにしてコーディングをする様になりました。(この「何か」を忘れています)

いわゆる「おまじない」的なことだったかも知れませんが、社内にこのことを知らせたいと思っており、そのために、このことを正式?に推奨する様なページ等がどこかにありませんでしょうか?

そもそも、この理解(使用)の仕方が間違っている場合はご指摘ください。

よろしくお願いいたします。



っていうかTimer.Enabled=Falseだけでいいじゃん。
Neverland
ベテラン
会議室デビュー日: 2006/11/27
投稿数: 56
投稿日時: 2007-11-08 11:02
それを言われると何も言えませんが、弊社では『.Interval = 0』でタイマーが止まるものと思っている開発者が多いので(本当は止まるはずでしょうけど)、

>そもそも、この理解(使用)の仕方が間違っている場合はご指摘ください。
でなければ、『.Enabled = False』だけにする理由となる材料が欲しかっただけです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-08 11:10
引用:

Neverlandさんの書き込み (2007-11-08 10:37) より:
タイマーのイベントを破棄(未使用にする(二重起動防止))する場合にプロパティで、『.Interval = 0』だけでは何故だかもう一度イベントが発生した様な記憶があり、何かで調べた結果、『.Interval = 0』と共に『.Enabled = False』をペアにしてコーディングをする様になりました。(この「何か」を忘れています)


以下、ぜんぶ推測です。私はこう思って長年 Timer コントロールを使っています、という例でしかありません。

ちなみに、
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbcon/html/vbup2020.asp
を読むと、
引用:

Visual Basic 6.0 では、Interval プロパティを 0 に設定することにより、Timer コントロールを無効にできました。


と書かれています。しかし、昔から Microsoft の VB 関係の仕様は実際に使ってみないと信用することができません。私は Interval は 1 <= x <= 65535 までが有効で、それ以外の値は使わないようにしてきました。
私は、Interval に 0 を入れると、無効にするのではなく、Timer コントロールが次回のタイマーが fire するタイミングを決定する際(これは今設定済みのタイマーが fire した後におこなわれる)に 0 だと、値を無効だとみなして fire しないようにするためのものではないかと推測しています。ですから、Interval = 0 にしても、今、予約済みのタイマーは取り消されないまま、fire する時刻を待っていて予約時刻が来れば fire してしまうのではないでしょうか。そして、その後は上述のように新たな予約がおこなわれないので、その後は fire しなくなるのではないでしょうか。

しかし、Interval = 1 を許して Interval = 0 を許さないのは汎用的ではないインターフェースです。また、タイマーの制御を Enabled のようなプロパティーでやるべきでしょうか?メソッドで制御すべきもののように思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-08 11:17
試しに VB5 でつぎのようなコードを書いて動かしてみました。
コード:
Option Explicit

Private Sub Command1_Click()
    Timer1.Interval = 10000
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    Timer1.Interval = 0
End Sub

Private Sub Timer1_Timer()
    Debug.Print "Timer fired."
End Sub


Command1 ボタンを押した時刻を T [秒]とすると、(T+10) [秒]に Print されますが、(T+15) [秒]に Command2 ボタンを押すと、(T+20) [秒]に再び Print されます。その後、Print はされなくなります。
この挙動から、前述の推測どおりだと思います。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
Neverland
ベテラン
会議室デビュー日: 2006/11/27
投稿数: 56
投稿日時: 2007-11-08 11:41
unibon さん誠にありがとうございました。お手数をお掛けいたしました。
「Timer1.Interval = 0」が、必ずしもタイマーを停止させる効果があるとは言えないことの証明であると理解しました。(Interval のタイミングが大いに関係する)

お手すきの時に一つ教えてください。
unibon さんがご回答された、
 >また、タイマーの制御を Enabled のようなプロパティーでやるべきでしょうか?
 >メソッドで制御すべきもののように思います。
この、メソッドで制御とは、どう言ったやり方でしょうか?
VB6.0 の Timer コントロールにはプロパティしか無い様なのですが...
(Timer とは別のやり方?)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-08 13:03
引用:

Neverlandさんの書き込み (2007-11-08 11:41) より:
unibon さんがご回答された、
 >また、タイマーの制御を Enabled のようなプロパティーでやるべきでしょうか?
 >メソッドで制御すべきもののように思います。
この、メソッドで制御とは、どう言ったやり方でしょうか?
VB6.0 の Timer コントロールにはプロパティしか無い様なのですが...
(Timer とは別のやり方?)


これはただの Microsoft に対する愚痴でして、タイマーの有効・無効のようなタイミングがクリチカルな制御は、
Timer1.Enabled = True
のようにプロパティーではなく、
Call Timer1.Enable(True)
のようなメソッド(Sub/Function)呼び出しのほうが、良いのではないか、という意味です。
こうすれば Interval と Enabled の機能の違いもはっきりします。

もっとも、現状では Enabled プロパティーを使うしかありません。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
Neverland
ベテラン
会議室デビュー日: 2006/11/27
投稿数: 56
投稿日時: 2007-11-08 13:42
ぶさいくろう さん、unibon さん
早急なご回答ありがとうございました。

コーディング例と共に、Enabled プロパティーを使用することを社内にアナウンスしたと思います。

スキルアップ/キャリアアップ(JOB@IT)