- - PR -
VB.NET タイマーイベントにて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 2006-03-19 22:08
そのように動作しているのを、どうやって確認しましたか? また、おそらく桁あふれか、それに類する例外が発生するとは思いますが、VB.NET ですよね?Option Strint Off だったら、勝手に縮小変換されちゃって、例外が生成されていないとか。 | ||||||||
|
投稿日時: 2006-03-19 22:19
まず、A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。 そして上記の2行をBreakPointに設定して実行してみてください。 その上で元からあるMe.Timer1.Stop()が実行されるタイミングはどうであるか。 それがわかれば、ループの原因が。。。 逆にループしてくれないとTimerとして成り立たないこともわかるはずです。 | ||||||||
|
投稿日時: 2006-03-19 22:53
早々に返答頂きありがとうございます。
<Jitta殿> >そのように動作しているのを、どうやって確認しましたか? →言語はVB.NETです。 MessageBox.ShowにBreakPointを設定し、そこからステップで実行すると 投稿した内容のような現象となりました。 <まどか殿> >A1の処理の先頭でMe.Timer1.Stop()として1回だけ実行されるようにしてください。 →上記のようにすると、「Me.Timer.Stop()→Return False→Finally」と処理が進行 するようになりました。しかし、何故最初のコードでは駄目なのかが理論的にわか りません。申し訳ありませんが、もう少しアドバイスを頂ければ幸いです。 宜しくお願いいたします。 | ||||||||
|
投稿日時: 2006-03-20 00:10
あっちゃー、すいません。 BreakPointをMe.Timer.Stop()のみにしてもう一度。。。 いつそこで止まりますか? そしてそこが実行されないとタイマーが止まらないということは。。。 | ||||||||
|
投稿日時: 2006-03-20 00:11
なるほどね。 ブレークしている間に、別のタイマーイベントが発生し、そっちのデバッグに移ってしまった。。。ってところかな。 | ||||||||
|
投稿日時: 2006-03-20 21:40
<Jitta・まどか殿>
アドバイスありがとうございました。 ようするに、TimerのInterval時間以上の処理を時間のかかる処理前にStopも実行せず に処理させていた為、次サイクルのTickイベントがかぶった状態となってしまったと いう事で宜しいでしょうか? Tickイベントでシリアル通信機器とポーリング処理を行おうと今回テストコードの ようなものを作成してみた次第です。 フォームタイマーにてInterval時間以上の処理を行う場合は、時間のかかる処理の 前にStopを実行しその上で処理を行い、その後で再度タイマーをStartさせるという 手順を踏めばよいという風に理解しておけば宜しいでしょうか? | ||||||||
|
投稿日時: 2006-03-20 21:52
そんな感じだと思います。
「そんなことなったっけ?」と自分のコードを見てみると、先頭で Stop していました(^-^; |