- - PR -
イベント内でのメッセージボックス使用による再入について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-07 21:30
すみません、適当に解決しましたので自己レスです。
MonthCalendar.DateChangedイベントでは処理要求フラグを立ててイベントを完了させ、 別途フラグ監視を行うSystem.Timers.Timerを宣言して、実内容を処理させました。 内部からフォームへの反映はInvokeを使うことで大体何とかなりました。 [以下、動作確認サンプルの差分コードです] Public Sub New() MyBase.New() InitializeComponent() AddHandler monthcheckTimer.Elapsed, AddressOf monthcheckTimer_OnTimedEvent Me.monthcheckTimer.Start() End Sub Private monthcheckTimer As New System.Timers.Timer(50) Private flag_Datachanged As Boolean = False Private count As Integer Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged If Not Me.flag_Datachanged Then Try count += 1 Trace.WriteLine("DataChanged Count=" & count) Catch ex As Exception Trace.Fail(ex.Message) Finally Me.flag_Datachanged = True End Try End If End Sub Private Sub monthcheckTimer_OnTimedEvent(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs) If Me.flag_Datachanged Then Me.monthcheckTimer.Stop() Try Trace.WriteLine("OnTimedEvent Count=" & count) MessageBox.Show("Event Count=" & count, "Test", MessageBoxButtons.OK) Catch ex As Exception Trace.Fail(ex.Message) Finally Me.flag_Datachanged = False Me.monthcheckTimer.Start() End Try End If End Sub 過去にThreadを使った時も似たような事をやっていました・・・今回はじゃんぬねっと さんの書き込みと冒頭のTimerスレッドの書き込みで思い出しました。 掲示板に書く事で頭を整理する事ができたからと思います、じゃんぬねっとさん には御助言大変感謝致しております。 本件、モーダルダイアログを使用する限り仕方が無いことなのでしょうか。 私はVB6は詳しくないのですが、VB6の過去のサンプルではこのような動きに ならなかったと記憶しています。 普段からApplication.DoEventsを極力使用しないよう、ループには気をつけて いるつもりだったのですが、今回の件はMessageBoxをApplication.DoEvents に置き換えても再現しません。 Timerのようにインターバル毎の別のイベントが再入してくるのではなく、同一イベント(ウインドウメッセージ)が何故複数回再入してくるのか、 スタックトレースの内容も恥ずかしながら細かくは判らない状態で 結局私には謎のままでした。機会があればここらへんの仕組みも調べて 理解したいです。 お付き合い頂き有難うございました。 | ||||||||
|
投稿日時: 2006-04-07 21:48
んん。。。書いたコードの字下げが上手くできません。スペースやTABじゃ駄目なんですね。・・・・・・BBコードとかいうのを使うみたいですね、すみません。
>Jittaさん 処理の内容はDataTableが持つレコードの検索です。ユーザーに日付を選択させて、 DataTable内から関連するレコードを提示し、Selectするか判断を仰ぐ、 検索を中断する、続行する等の処理をしています。 ・・・作っていて、別途"検索Button"を設置して、Button.Clickイベントで CurrentCellから次点を1点ずつ検索するのが良いかと今になって 思った次第ですが、再入に関しては前から率直な疑問点でしたのでお聞きしました。大変お騒がせ致しました。 | ||||||||
|
投稿日時: 2006-04-08 21:49
登校時に、「この投稿で BBコード をつかわない」というところがリンクになっていますから、そこをクリックすると説明が出ます。[ code ] [ /code ]で囲めばいいです。
再入というか、「再帰呼び出し」のような感じがします。 最初に参照されている投稿とは、話が違うと思います。あちらはマルチスレッドで実行されており、処理の実行にかかわらず呼び出されますが、イベント処理中に行った何かがトリガとなっているわけではありません。 しかし、こちらの問題は、イベント処理中に行うことがトリガとなって、イベントが発生しています。 |