- PR -

VB.NET によるイベント ハンドラのについて

投稿者投稿内容
Yun
会議室デビュー日: 2004/02/10
投稿数: 13
投稿日時: 2004-02-10 21:45
初めまして。
作成したクラスのEventをデリゲートして値を変更したいのですが
イベント ハンドラの動きが上手くいきません。

↓↓↓以下プログラミング↓↓↓

注:タイマーは実装してあります
Private Sub Form_Load
TestTime.Interval = 1
TestTime.Enabled = True
TestTime.Start()
End Sub

Private Sub Button1_Click()
'作成したクラスにイベントを実装しました
Dim clsTest As New clsSample
'RaiseEventでイベントを実装
AddHandler clsTest.evtEvent, AddressOf Sample1
'ここでclsTestクラスがnothingされます。
clsTest.Dispose()
End Sub

Private Sub Sample1()
TestTime.Interval = 100
End Sub

Private Sub Timer1_Tick()
Debug.WriteLine("タイマーイベント発生して!")
End Sub

動いていたTimer1_Tickが、このclsTest.Dispose()が終了した時点で
動かなくなってしまいます。
clsTestがDisposeで解放されてしまい、Sample1との繋がりが原因
と思われるのですが、回避方法は無いものでしょうか?
長文になりましたが、何卒ヨロシク御願いします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-02-10 21:58
なっくさんが提示されたソースではタイマーオブジェクトとButton1_Click()内でnewしているclsSample型のインスタンスとの関係が読み取れません。

あるいは、実際関係がないのに何か勘違いをされているのかもしれませんが・・・。

ソースの必要ないと思われる部分を取り除いて書き込みされていますよね、おそらく。
取り除く部分を間違っていると思います。
Yun
会議室デビュー日: 2004/02/10
投稿数: 13
投稿日時: 2004-02-12 11:16
返信ありがとうございます。

>取り除く部分を間違っていると思います。
確かに上記だけでは正常に動いてしまいました。
申し訳ないです。問題はclsSampleにあるようです。
clsSampleでプロセス制御して実行終了時にSample1関数で
タイマーを変更する処理です。
Sample1が実行されたあとTimer1_Tickが止まってしまうようです。

ちなみに、Sample1のTestTime.Interval = 100
をコメントアウトした状態では問題なくTimer1_Tickが動いています。

Button1_Clickで必要ない部分を削除しました。
↓↓↓以下プログラミング↓↓↓

Private Sub Button1_Click()
'作成したクラスにイベントを実装しました
Dim clsTest As New clsSample
'RaiseEventでイベントを実装
AddHandler clsTest.evtEvent, AddressOf Sample1

clsTest.Action()
End Sub

Class clsSample
Public Event evtEvent()
Protected SampleProcess As New Process

Public Sub Action()
'起動するファイルを設定
SampleProcess.StartInfo.FileName = "C:Test.txt"

'新しいプロセスを実行
SampleProcess.Start()
End Sub

Public Sub New()
'プロセス終了時にExitedイベントを発生させる
SampleProcess.EnableRaisingEvents = True

'イベントハンドラの追加
AddHandler SampleProcess.Exited, AddressOf processExited
End Sub

'process終了処理
Protected Sub processExited(ByVal sender As Object, _
ByVal e As EventArgs)
'終了イベント発生
RaiseEvent evtEvent()

End Sub
End Class
ナキヲ
常連さん
会議室デビュー日: 2003/08/22
投稿数: 32
お住まい・勤務地: 京都・自宅から勤務地まで自転車で40分
投稿日時: 2004-02-12 11:51
ちょっと見ただけでは、結局なにをしたいのかが今ひとつ
ぴんときません(なんとなくは想像は付きますが。。)

今の実装方法が、あなたがやりたいことに適しているかどうか
わかりませんし、もしかしたら他に方法があるかもしれません。

問題がないのならば、
・今やりたいことはこれ
・で、とりあえずこのように実装してみようとした
・しかしだめだった

という感じの情報を流したほうが、レスが付きやすいと思いますよ
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-12 13:12
引用:

(なっくさん 投稿日時: 2004-02-10 21:45)
Private Sub Timer1_Tick()
Debug.WriteLine("タイマーイベント発生して!")
End Sub



まずは実際のコードから問題を再現する必要最小限のコードを取り出して
その本物を提示された方がよいと思います。

このTimer1_Tickプロシージャは提示のコードを見る限りではどこからも呼ばれません。
イベントとしても発生しません。これは実際のコード(からの抜粋)じゃないですよね?

Timer1_Tickプロシージャは見た感じはTimer1コントロールの
Tickイベント用のイベントプロシージャを意図しているのだと思いますが、
引数にsenderやeもありませんし、Handlesもありません。
(AddHandlerでのイベントとの関連付けがあるわけでもありません)

その後の「投稿日時: 2004-02-12 11:16」で投稿されている追加のコードを
見ても、元投稿のすべての不明点が解決していないので、やはり問題点がわかりません。
前のコードに対して、次の投稿で追加のコードを提示するのではなく、
問題を再現できる必要最小限のコードを1度で提示して下さい。

#Button1_ClickプロシージャもおそらくはsenderやeやHandlesを省略されているようですが、
#そういう中途半端な省略もやめましょう。
Yun
会議室デビュー日: 2004/02/10
投稿数: 13
投稿日時: 2004-02-12 13:17
返信ありがとうございます

引用:

ナキヲさんの書き込み (2004-02-12 11:51) より:
今の実装方法が、あなたがやりたいことに適しているかどうか
わかりませんし、もしかしたら他に方法があるかもしれません。



すいません、確かに仰るとうりです。
最初から読んでると何をやりたいか書いてないですね^^;
纏めてみます。

・今やりたいこと
クラス内にて
1,ファイル実行
2,実行中に裏で処理をさせたい(ファイル実行中の間Loop処理)
3,実行終了報告をForm側に返したい。(同時に2で処理をさせた物を終了)
(2はサンプルソースには書いてません)

・で、とりあえずこのように実装してみようとした
クラスでプロセスを作成。
プロセス終了時にイベントを発生させる
発生させたイベントをForm側で受け取る

・しかしだめだった
何故か、動いていたタイマーイベントが止まってしまいました。



引用:

よねKENさんの書き込み (2004-02-12 13:12) より:
問題を再現できる必要最小限のコードを1度で提示して下さい。。



はい、下記ソースで現象は確認できました。
注:Form1にタイマーコントロール追加
名前 Timer1
↓↓↓以下プログラミング↓↓↓

Public Class Form1
Inherits System.Windows.Forms.Form

'Windows フォーム デザイナで生成されたコード は省略

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
With Timer1
.Interval = 1
.Enabled = True
.Start()
End With
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Debug.WriteLine("タイマーイベント発生中!")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'作成したクラスにイベントを実装しました
Dim clsTest As New clsSample
'RaiseEventでイベントを実装
AddHandler clsTest.evtEvent, AddressOf Sample1

clsTest.Action()

End Sub

Private Sub Sample1()
Timer1.Interval = 100
Debug.WriteLine("Sample1実行!!!!!ここでタイマーが止まる。")
End Sub
End Class


Class clsSample
Public Event evtEvent()
Protected SampleProcess As New Process

Public Sub Action()
'起動するファイルを設定
SampleProcess.StartInfo.FileName = "C:Test.txt"

'新しいプロセスを実行
SampleProcess.Start()
End Sub

Public Sub New()
'プロセス終了時にExitedイベントを発生させる
SampleProcess.EnableRaisingEvents = True

'イベントハンドラの追加
AddHandler SampleProcess.Exited, AddressOf processExited
End Sub

'process終了処理
Protected Sub processExited(ByVal sender As Object, _
ByVal e As EventArgs)
'終了イベント発生
RaiseEvent evtEvent()

End Sub
End Class

回避方法、原因も分かる方いましたら
今後の勉強の為に教えていただきたいです。
長文になりましたが、何卒ヨロシクお願いします。

[ メッセージ編集済み 編集者: なっく 編集日時 2004-02-12 13:29 ]

[ メッセージ編集済み 編集者: なっく 編集日時 2004-02-12 13:40 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-12 14:19
引用:

なっくさんの書き込み (2004-02-12 13:17) より:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'作成したクラスにイベントを実装しました
Dim clsTest As New clsSample
'RaiseEventでイベントを実装
AddHandler clsTest.evtEvent, AddressOf Sample1

clsTest.Action()

End Sub



 問題が再現する/しないの前に、これってコンパイル通りました?私のところでは、VB.NETでは、メソッドの自動変数にイベントハンドラを追加できないのですが。。。イベントハンドラを追加しようとすると、クラス変数として、WidthEvents宣言をしないと追加できないのですが、それって私のやり方がまずい?
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-12 14:29
こんにちわ。

引用:

Jittaさんの書き込み (2004-02-12 14:19) より:

 問題が再現する/しないの前に、これってコンパイル通りました?私のところでは、VB.NETでは、メソッドの自動変数にイベントハンドラを追加できないのですが。。。イベントハンドラを追加しようとすると、クラス変数として、WidthEvents宣言をしないと追加できないのですが、それって私のやり方がまずい?



http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vastmAddHandlerStatement.asp

VB6ですと、WithEvents(WidthEventsではないですよw)宣言の方法しかありませんが、
.NETはいくつかやり方があるようですね。

[追加]
おっと、こちらの方が参考になりますか。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vaconUnderstandingEventHandlers.asp
[/追加]


[ メッセージ編集済み 編集者: りばぁ 編集日時 2004-02-12 14:30 ]

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