C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: BackgroundWorker使用時のイベント通知


(過去ログ 10 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■1708 / inTopicNo.1)  BackgroundWorker使用時のイベント通知
  
□投稿者/ nispa (1回)-(2007/03/03(Sat) 19:39:36)

分類:[VB.NET (Windows)] 

VB2005 ExpressをWinXP SP2上で使用しています。

BackgroundWorkerを使って別スレッドで装置から温度取得し、
フォーム(MainMenu)にイベントで通知したいのですが、
イベントを受けたフォーム側で例外(InvalidOperationException)が発生してしまいます。

別スレッドからフォーム(のコントロール)にアクセスするにはどのようにしたらいいのでしょう?
ご教授願います。以下、長いですがソースです。

Public Class MainClass
    Public Shared Sub Main()
        Dim observer As TempObserver
        observer = TempObserver.GetInstance
        observer.StartObserve() '温度取得開始

        Dim frm As New MainMenu
        frm.ShowDialog()
    End Sub
End Class

'温度を表示するフォーム
Public Class MainMenu
    Private Sub MainMenu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim observer As TempObserver = TempObserver.GetInstance

        AddHandler observer.TemparatureChange, AddressOf TemparatureChange
    End Sub

    'TempObserverのTemparatureChangeイベントを受ける
    Private Sub TemparatureChange(ByVal temparature)
        Me.lblTemparature.Text = Format(temparature, "0.0") & "℃"    'この行で例外発生(InvalidOperationException)

    End Sub
End Class

'装置から温度取得するクラス
Public Class TempObserver
    Private temparature As Double                               '温度
    Private worker As System.ComponentModel.BackgroundWorker    '使用するBackgroundWorker
    Private Shared instance As TempObserver                     'このクラスのインスタンス
    
    Public Event TemparatureChange(ByVal temparature) '温度変化の通知イベント

    Public Shared Function GetInstance() As TempObserver
        If (instance Is Nothing) Then
            instance = New TempObserver
        End If
        Return instance
    End Function
    
    'SingletonにしたいのでPrivate
    Private Sub New()
        temparature = 0
        worker = New System.ComponentModel.BackgroundWorker
        worker.WorkerSupportsCancellation = True                 'キャンセル処理を受け付けるように設定
        AddHandler worker.DoWork, AddressOf ObserveTemparature   'DoWorkイベントをObserveTemparatureに関連付ける
        AddHandler worker.RunWorkerCompleted, AddressOf CallBack 'RunWorkerCompletedイベントをCallBackに関連付ける
    End Sub

    '温度監視を開始する
    Public Sub StartObserve()
        If (worker.IsBusy = False) Then
            worker.RunWorkerAsync()
        End If
    End Sub

    '温度を観測する(BackgroundWorkerのDoworkイベント)
    Private Sub ObserveTemparature(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
 System.Threading.Thread.Sleep(1000)

        '(温度取得処理)
 'temparatureに温度が代入される
    End Sub

    'BackgroundWorkerのCompleteEvent(温度を通知する)
    Protected Sub CallBack(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
        RaiseEvent TemparatureChange(temparature)
        Call StartObserve()
    End Sub
End Class

引用返信 編集キー/
■1709 / inTopicNo.2)  Re[1]: BackgroundWorker使用時のイベント通知
□投稿者/ Hirotow (44回)-(2007/03/03(Sat) 19:53:14)
Hirotow さんの Web サイト
http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html
このあたりを参考にどうぞ。
引用返信 編集キー/
■1711 / inTopicNo.3)  Re[2]: BackgroundWorker使用時のイベント通知
□投稿者/ aoa (12回)-(2007/03/03(Sat) 21:17:02)
こちらでもわかりやすく説明してくれています。
http://csharper.blog57.fc2.com/blog-category-12.html

引用返信 編集キー/
■1715 / inTopicNo.4)  Re[3]: BackgroundWorker使用時のイベント通知
□投稿者/ nispa (2回)-(2007/03/03(Sat) 23:03:08)
レスありがとうございます。
Invokeメソッドを使って解決しました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -