- PR -

VB.NET タイマーイベントにて

投稿者投稿内容
みるきー
会議室デビュー日: 2006/03/19
投稿数: 3
投稿日時: 2006-03-19 21:49
どなたか御教授願います。
環境:WinxpProSP2
言語:VB.NET2003

Windowsフォームにボタン・フォームタイマーが各1つあります。
ボタン(タイマースタートボタン)クリック後、下記コードの
処理A1を実行します。
処理A1では、故意にエラーを発生させるようにしています。
ボタンがクリックされタイマーがスタートし処理A1にてエラーを
Catchしエラー内容をメッセージボックスにて表示させタイマーを
ストップさせたいのですが、
「Me.Timer.Stop()→Return False→Finally」
処理と進行せず、Timer_Tickイベントの1行目(If A1() = False Then)に
戻ってしまいループしてしまいます。
どうしてでしょうか?また、何が原因なのでしょうか?宜しくお願い
いたします。

(コード)
'-------------------------------------------------------------------------
'タイマースタートボタン
'-------------------------------------------------------------------------
Private Sub TimerStartbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerStartbtn.Click

Me.Timer.Interval = 1000
Me.Timer.Start()

End Sub
'-------------------------------------------------------------------------
'タイマーイベント
'-------------------------------------------------------------------------
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick

If A1() = False Then
Debug.WriteLine("処理A1は結果Falseでした。")
Else
Debug.WriteLine("処理A1は結果Trueでした。")
End If

End Sub
'-------------------------------------------------------------------------
'タイマーイベントで呼び出される処理
'-------------------------------------------------------------------------
Private Function A1() As Boolean

Dim ret As Boolean

Dim b As Integer
Try
For i As Integer = 1 To 10000
b = b + i + 20000000
Next
Return True

Catch ex As Exception

MessageBox.Show(ex.Message, _
"err", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
Me.Timer.Stop()
Return False
Finally
Debug.WriteLine("処理A1のFinallyは実行されました。")
End Try
End Function
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-19 22:08
引用:

みるきーさんの書き込み (2006-03-19 21:49) より:

「Me.Timer.Stop()→Return False→Finally」
処理と進行せず、Timer_Tickイベントの1行目(If A1() = False Then)に
戻ってしまいループしてしまいます。
どうしてでしょうか?また、何が原因なのでしょうか?宜しくお願い
いたします。


そのように動作しているのを、どうやって確認しましたか?

また、おそらく桁あふれか、それに類する例外が発生するとは思いますが、VB.NET ですよね?Option Strint Off だったら、勝手に縮小変換されちゃって、例外が生成されていないとか。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-03-19 22:19
引用:

戻ってしまいループしてしまいます。

コード:
MessageBox.Show(ex.Message, _
"err", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
Me.Timer.Stop()




まず、A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。
そして上記の2行をBreakPointに設定して実行してみてください。
その上で元からあるMe.Timer1.Stop()が実行されるタイミングはどうであるか。
それがわかれば、ループの原因が。。。
逆にループしてくれないとTimerとして成り立たないこともわかるはずです。
みるきー
会議室デビュー日: 2006/03/19
投稿数: 3
投稿日時: 2006-03-19 22:53
早々に返答頂きありがとうございます。
<Jitta殿>
>そのように動作しているのを、どうやって確認しましたか?
→言語はVB.NETです。
 MessageBox.ShowにBreakPointを設定し、そこからステップで実行すると
 投稿した内容のような現象となりました。

<まどか殿>
>A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。
→上記のようにすると、「Me.Timer.Stop()→Return False→Finally」と処理が進行
 するようになりました。しかし、何故最初のコードでは駄目なのかが理論的にわか
 りません。申し訳ありませんが、もう少しアドバイスを頂ければ幸いです。
 宜しくお願いいたします。


まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-03-20 00:10
引用:

 MessageBox.ShowにBreakPointを設定し、そこからステップで実行すると
 投稿した内容のような現象となりました。

>A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。
→上記のようにすると、「Me.Timer.Stop()→Return False→Finally」と処理が進行
 するようになりました。しかし、何故最初のコードでは駄目なのかが理論的にわか
 りません。


あっちゃー、すいません。
BreakPointをMe.Timer.Stop()のみにしてもう一度。。。
いつそこで止まりますか?
そしてそこが実行されないとタイマーが止まらないということは。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-20 00:11
引用:

みるきーさんの書き込み (2006-03-19 22:53) より:
早々に返答頂きありがとうございます。

<まどか殿>
>A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。
→上記のようにすると、「Me.Timer.Stop()→Return False→Finally」と処理が進行
 するようになりました。しかし、何故最初のコードでは駄目なのかが理論的にわか
 りません。申し訳ありませんが、もう少しアドバイスを頂ければ幸いです。
 宜しくお願いいたします。


 なるほどね。

 ブレークしている間に、別のタイマーイベントが発生し、そっちのデバッグに移ってしまった。。。ってところかな。
みるきー
会議室デビュー日: 2006/03/19
投稿数: 3
投稿日時: 2006-03-20 21:40
<Jitta・まどか殿>
アドバイスありがとうございました。
ようするに、TimerのInterval時間以上の処理を時間のかかる処理前にStopも実行せず
に処理させていた為、次サイクルのTickイベントがかぶった状態となってしまったと
いう事で宜しいでしょうか?
Tickイベントでシリアル通信機器とポーリング処理を行おうと今回テストコードの
ようなものを作成してみた次第です。
フォームタイマーにてInterval時間以上の処理を行う場合は、時間のかかる処理の
前にStopを実行しその上で処理を行い、その後で再度タイマーをStartさせるという
手順を踏めばよいという風に理解しておけば宜しいでしょうか?



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-20 21:52
 そんな感じだと思います。

 「そんなことなったっけ?」と自分のコードを見てみると、先頭で Stop していました(^-^;

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