マルチスレッドで別スレッドからメインスレッドのテキストボックスに文字を表示するには
- 題名: マルチスレッドで別スレッドからメインスレッドのテキストボックスに文字を表示するには
- 著者: なまちゃ
- 日時: 2012/04/13 11:03:37
- ID: 30301
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: マルチスレッドで別スレッドからメインスレッドのテキストボックスに文字を表示するには
- 著者: 管理人
- 日時: 2012/04/14 0:24:58
- ID: 30312
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: マルチスレッドで別スレッドからメインスレッドのテキストボックスに文字を表示するには
- 著者: なまちゃ
- 日時: 2012/04/17 9:39:44
- ID: 30338
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: マルチスレッドで別スレッドからメインスレッドのテキストボックスに文字を表示するには
- 著者: shu
- 日時: 2012/04/17 16:41:58
- ID: 30350
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
いつもお世話になっております。
環境は以下の通りです。
Windows XP SP3
VB.NET 2010 Express
現在マルチスレッドのプログラムを初めて組んでおります。
そこで、modSub.subHogeの「fmMain.Invoke(New dlgSetText・・・」の個所で
”ウィンドウ ハンドルが作成される前、コントロールで Invoke または BeginInvoke を呼び出せません。” というエラーが帰ってきます。
初めてマルチスレッドを勉強していますので、このようなコーディングでいいのかさえ分からないので
そこからご指摘して頂けたらありがたいです。
ソースが長いので簡単に処理の流れを記入しておきます。
○使用するフォーム、モジュール
・fmMain
・modSub
1.fmMainのBtn1をクリックし、別モジュールの関数(modSub.subHoge)を別スレッドで開始
2.別モジュールの関数(modSub.subHoge)からデリゲードを利用?し、fmMainのテキストボックスに文字を記載する
といった処理になっています。
以上、よろしくお願い致します。
'----------------------------------------------------------------------------------------------------
' ▽▽▽▽ fmMain ここから ▽▽▽▽
'----------------------------------------------------------------------------------------------------
Imports System.Threading
Imports TEST.modSub
Public Class fmMain
'======================================================
' テスト用別スレッド
'======================================================
Private ThreadSub As System.Threading.Thread
'======================================================
' @別スレッドスタートボタン
'======================================================
Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
'このテキストボックスに文字を表示したい
TextBox1.text = ""
ThreadSub = New System.Threading.Thread(AddressOf modSub.subHoge)
ThreadSub.Start()
End Sub
'======================================================
' 別スレッドも終わらす
'======================================================
Private Sub fmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
ThreadSub.Abort()
End Sub
End Class
'----------------------------------------------------------------------------------------------------
' △△△△ fmMain ここまで △△△△
'----------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------------
' ▼▼▼▼ modSub ここから ▼▼▼▼
'----------------------------------------------------------------------------------------------------
Imports System.Threading
Module modSub
'======================================================
' デリゲード
'======================================================
Delegate Sub dlgSetText(ByVal txt As Object, ByVal text As String)
'======================================================
' Bメインフォームのテキストボックスに書込み
'======================================================
Private Sub threadTextValue(ByVal sender As Object, ByVal strValue As String)
Dim txt As TextBox = DirectCast(sender, TextBox)
txt.Text = strValue
End Sub
'======================================================
' Aメインから別スレッドとして呼ばれる関数
'======================================================
Private Sub subHoge()
fmMain.Invoke( _
New dlgSetText(AddressOf threadTextValue), New Object() {fmMain.TextBox1, "別スレッドから値きました!"} _
)
End sub
End Module
'----------------------------------------------------------------------------------------------------
' ▲▲▲▲ modSub ここまで ▲▲▲▲
'----------------------------------------------------------------------------------------------------