dポイントプレゼントキャンペーン実施中!

はじめて質問させていただく、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のウォッチをするとその時点で
処理がとまってしまいます。なぜとまるのかが知りたいです。
作成方法がまずいのでしょうか?
皆様よろしくお願いいたします。

A 回答 (2件)

NETは未経験ですが、VB6も同じです。

VB6の説明で申し訳ないですが、書いておきます。

質問の中に答えがあるように思えます。
>ブレークポイントを置いて
ブレークポイントを置いたから止まっているのです。

NETの構文はやはりわかりませんが、タイマーは割り込みで発生しようとします。その割り込みを許可するにはDoEventで行います。DoEventsを発行すると、他の割り込み処理が走ります。
NETには似たようなものはありませんか?

この回答への補足

いろいろ試してみた結果を補足させてください。
イベント受信部を以下の様に変更してみました。
ケース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度停止させ全て削除してから上記の事を行いました。

補足日時:2003/03/05 09:57
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/05 09:52

むむむ・・・どうやら、NET特有の状態っぽいですね。

。。

環境ほすぃよー。
すいません。お役に立てそうにないです。
;;
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/07 11:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!