
■.NETモジュールプロジェクト(DLL)
Public Class MyClass
Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )
Private WithEvents Timer As Timers.Timer
Private Sub New()
Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()
End Sub
Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed
RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる
End Sub
End Class
■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE)
Public Class Form1
Private WithEvents foo As MyClass.MyClass
Public Sub New()
InitializeComponent()
foo = New MyClass.MyClass
End Sub
Private Sub bar() Handles foo.hoge
TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み
End Sub
End Class
という 2 プロジェクトを含むソリューションを作成しました。実行すると、
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。
というエラーが出てきます。
foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。
その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。
No.1ベストアンサー
- 回答日時:
別スレッドで動作するタイマーによってイベントが発生するのが仕様なのですから,
それにあわせて使う側が処理します。
ControlをUIスレッド以外から扱うことはできません。
具体的には,barの中でControl.InvokeRequiredが真であれば,
Control.InvokeまたはControl.BeginInvokeを呼び出して,
その中でControlへアクセスする,というものです。
ButtonやFormのイベントは,UIスレッド上で発生します。
そのため,スレッドの問題は関係してきません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB2005 シリアル通信のClose処理
-
VC++スレッドの正しい終了のさ...
-
別スレッドからメインダイアロ...
-
スレッドの監視方法について
-
_beginthreadexで生成したスレ...
-
msec単位のWait Timerが作れない!
-
一定時間ごとにメッセージを表...
-
スレッド終了を待つ間に開放さ...
-
C++ GUIのメッセージループ。
-
WaitForSingleObjectの使い方に...
-
pthread_attr_tへの値の代入に...
-
スレッドにて同一メモリの書き...
-
マルチスレッドのスレッド数を...
-
CWnd::OnTimerのスレッドの取得
-
スレッドの終了はどうやるんで...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
プログラム上のCPU稼働率低減に...
-
プロセスIDの取得方法について
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
複数スレッドを動作させるのに...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
同一スレッドで、ロックをかけ...
-
マルチスレッド内のループについて
-
sleep関数とは?
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
CWnd::OnTimerのスレッドの取得
-
C言語である関数への同時アクセ...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
pthreadの使い方
-
ユーザーインターフェイスの一...
-
Linuxでスレッド優先度って変え...
-
win32 スレッドのハンドルついて
おすすめ情報