• 締切済み

VB.NET スレッドからのイベント受信について

はじめて質問させていただく、VB.NET初心者です。 ただいまスレッド、イベント処理を作成中で Form1にButton1、Label1を貼り付け以下の様なプログラムを記述しました。 (スレッドにて5秒ごとにイベントを発生させます。) 'イベント引数 Public Class EventArgs Inherits System.EventArgs Public nowTime As String End Class 'イベント発行 Public Class EventTest Public Event _event(ByVal sender As Object, ByVal e As EventArgs) Public Sub Go() Dim args As New EventArgs() args.nowTime = Now.ToString RaiseEvent _event(Me, args) End Sub End Class 'フォーム内処理 'スレッド宣言 Dim MyThread As New System.Threading.Thread(AddressOf _Thread) Private WithEvents _test As New EventTest() 'イベント受信   Private Sub Handler(ByVal sender As System.Object, ByVal e As EventArgs) Handles _test._event Label1.Text = e.nowTime End Sub 'スレッド(5秒間隔でイベント発行) Private Sub _Thread() Dim i As Integer For i = 0 To 99 System.Threading.Thread.Sleep(5000) _test.Go() Next End Sub 'スレッド起動 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MyThread.Start() End Sub End Class 開発環境から普通に実行すれば正常に動作している様なのですが、 イベント受信部(Handler)のLabel1.Text = e.nowTime部に ブレークポイントを置いてLabel1のウォッチをするとその時点で 処理がとまってしまいます。なぜとまるのかが知りたいです。 作成方法がまずいのでしょうか? 皆様よろしくお願いいたします。

みんなの回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

むむむ・・・どうやら、NET特有の状態っぽいですね。。。 環境ほすぃよー。 すいません。お役に立てそうにないです。 ;;

JoyJoyJoy
質問者

お礼

おつきあいありがとうございます。 なかなかNETというのは手強くって弱ってしまいます。 又何かあればよろしくお願いいたします。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

NETは未経験ですが、VB6も同じです。VB6の説明で申し訳ないですが、書いておきます。 質問の中に答えがあるように思えます。 >ブレークポイントを置いて ブレークポイントを置いたから止まっているのです。 NETの構文はやはりわかりませんが、タイマーは割り込みで発生しようとします。その割り込みを許可するにはDoEventで行います。DoEventsを発行すると、他の割り込み処理が走ります。 NETには似たようなものはありませんか?

JoyJoyJoy
質問者

お礼

ご回答ありがとうございます。 ただ説明不足で正確に現象をお伝えできてない部分がありました。申し訳ありません。 補足します。 1度DoEventsの事も調べてみます。

JoyJoyJoy
質問者

補足

いろいろ試してみた結果を補足させてください。 イベント受信部を以下の様に変更してみました。 ケース1 Private Sub Handler(ByVal sender As System.Object, ByVal e As EventArgs) Handles _test._event Beep()           'ブレークポイントをここにする。 End Sub 結果:ブレーク後、再開しても処理は行い次のイベントが発生する。 ケース2 上記コードのBeep()を Button1.Text = e.nowTime にして同じくブレークポイントを置いてみる。 結果:ブレークし、Button1の中身をウォッチウィンドウでのぞくことができる。 再開後、次のイベントが発生する。 ケース3 上記コードを Label1.Text = e.nowTime にして同じくブレークポイントを置いてみる 結果:ブレークし、Label1の中身をウォッチウィンドウでのぞくと展開に非常に時間がかかります。展開後、メンバ?(言い方が違うかもしれません)のPreferredWidth,RenderTransparent,TabStop,TextAlign,UseMnemonicの値表示のところに"error:cannot obtain value"と表示されます。 その後再開してもフォームがアクティブにならず次のイベントも発生しません。 強制的に停止ボタンで実行を終了しないといけなくなります。 ケース4 Button1.Text = e.nowTimeにコードを戻してブレーク後、Label1をウォッチウィンドウで表示させる。 結果:ウォッチのLabel1の値が通常は{System.Windows.Forms.Label}と表示されるのに"error:cannot obtain value"と表示され展開ができない。処理再開後もケース3と同じ。 以上からLabel1をウォッチするだけでおかしくなっている様に思えます。 なぜなのでしょうか?Labelは使用してはいけないのでしょうか? よろしくお願いいたします。 尚、ウォッチウィンドウに登録されている変数名はフォームロード時に1度停止させ全て削除してから上記の事を行いました。

関連するQ&A