- PR -

イベント内でのメッセージボックス使用による再入について

投稿者投稿内容
hagi
会議室デビュー日: 2006/04/07
投稿数: 6
投稿日時: 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のようにインターバル毎の別のイベントが再入してくるのではなく、同一イベント(ウインドウメッセージ)が何故複数回再入してくるのか、
スタックトレースの内容も恥ずかしながら細かくは判らない状態で
結局私には謎のままでした。機会があればここらへんの仕組みも調べて
理解したいです。 お付き合い頂き有難うございました。
hagi
会議室デビュー日: 2006/04/07
投稿数: 6
投稿日時: 2006-04-07 21:48
んん。。。書いたコードの字下げが上手くできません。スペースやTABじゃ駄目なんですね。・・・・・・BBコードとかいうのを使うみたいですね、すみません。

>Jittaさん
処理の内容はDataTableが持つレコードの検索です。ユーザーに日付を選択させて、
DataTable内から関連するレコードを提示し、Selectするか判断を仰ぐ、
検索を中断する、続行する等の処理をしています。
・・・作っていて、別途"検索Button"を設置して、Button.Clickイベントで
CurrentCellから次点を1点ずつ検索するのが良いかと今になって
思った次第ですが、再入に関しては前から率直な疑問点でしたのでお聞きしました。大変お騒がせ致しました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-08 21:49
引用:

hagiさんの書き込み (2006-04-07 21:48) より:
んん。。。書いたコードの字下げが上手くできません。スペースやTABじゃ駄目なんですね。・・・・・・BBコードとかいうのを使うみたいですね、すみません。


登校時に、「この投稿で BBコード をつかわない」というところがリンクになっていますから、そこをクリックすると説明が出ます。[ code ] [ /code ]で囲めばいいです。


引用:

思った次第ですが、再入に関しては前から率直な疑問点でしたのでお聞きしました。大変お騒がせ致しました。


再入というか、「再帰呼び出し」のような感じがします。

最初に参照されている投稿とは、話が違うと思います。あちらはマルチスレッドで実行されており、処理の実行にかかわらず呼び出されますが、イベント処理中に行った何かがトリガとなっているわけではありません。
 しかし、こちらの問題は、イベント処理中に行うことがトリガとなって、イベントが発生しています。

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