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

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

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

Re[6]: スレッドからフォームのテキストボックに文字列を表示させたい


(過去ログ 106 を表示中)

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

■63276 / inTopicNo.1)  スレッドからフォームのテキストボックに文字列を表示させたい
  
□投稿者/ 高橋 (3回)-(2012/08/10(Fri) 00:14:59)

分類:[.NET 全般] 

フォームにはボタンとテキストボックスが配置してあり、
フォームのボタンを押すと、
フォームとは別のクラスのスレッドが動き、そのスレッドから
フォームにアクセスし、TextBoxに文字列を表示させる。
ということをやりたいのですが、

Form1_instans.Invoke(New del_text(AddressOf Form1_instans.text_mes), "Hello World")の行で
必ず、「ウィンドウ ハンドルが作成される前、
コントロールで Invoke または BeginInvoke を呼び出せません。」というエラーが出ます。

ググると幾つか情報が出てきますが、
どれを読んでも理解できなかったです。

例文を教えて下さい。

開発環境はWindows 7 vb.net visual studio 2010です。

'Form1.vbのソース
'------------------------------------------------------------------------
Imports System.Threading
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       
    End Sub
    Public Sub text_mes(ByVal Val_mes As String)

        TextBox1.AppendText(Val_mes)

    End Sub
   
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim th1 As Thread
        Dim th1_instans As th1_class = New th1_class
        th1 = New Thread(New ThreadStart(AddressOf th1_instans.ThreadTest))
        th1.Start()
    End Sub
End Class

'------------------------------------------------------------------------
'th1_class.vbのソース
'------------------------------------------------------------------------

Public Class th1_class
    Delegate Sub del_text(ByVal del_text_val As String)
    Public Sub ThreadTest()
        Dim Form1_instans As Form1 = New Form1

        Form1_instans.Invoke(New del_text(AddressOf Form1_instans.text_mes), "Hello World")
    End Sub
End Class

-------------------------------------------------------

引用返信 編集キー/
■63277 / inTopicNo.2)  Re[1]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ Azulean (9回)-(2012/08/10(Fri) 00:25:10)
No63276 (高橋 さん) に返信
> Form1_instans.Invoke(New del_text(AddressOf Form1_instans.text_mes), "Hello World")の行で
> 必ず、「ウィンドウ ハンドルが作成される前、
> コントロールで Invoke または BeginInvoke を呼び出せません。」というエラーが出ます。

エラーの文面通りですよ。

Invoke に使っている Form1_instans はすでに表示されている Form1 とは別に New で作ってしまっていますよね?
新しく作って表示される前(ウィンドウハンドルが作成される前)であるため、Invoke を呼び出せないというエラーです。

すでに表示されているフォームを受け取る(th1_class のコンストラクタで渡す、プロパティで渡す)などして、表示されているフォームに対して実行するようにしてください。
あるいは、th1_class をイベントを呼び出す形に変えて、Form1 側でそのイベントにイベントハンドラを設定し、そのイベントハンドラの中で Invoke するとか。
引用返信 編集キー/
■63278 / inTopicNo.3)  Re[2]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ 高橋 (4回)-(2012/08/10(Fri) 00:47:43)

> エラーの文面通りですよ。
>
> Invoke に使っている Form1_instans はすでに表示されている Form1 とは別に New で作ってしまっていますよね?
> 新しく作って表示される前(ウィンドウハンドルが作成される前)であるため、Invoke を呼び出せないというエラーです。
>
> すでに表示されているフォームを受け取る(th1_class のコンストラクタで渡す、プロパティで渡す)などして、表示されているフォームに対して実行するようにしてください。
> あるいは、th1_class をイベントを呼び出す形に変えて、Form1 側でそのイベントにイベントハンドラを設定し、そのイベントハンドラの中で Invoke するとか。

ありがとうございます。
さっぱり分からないです。
コンストラクタも、プロパティも、イベントハンドラも分からないのです。
よろしければ例文で教えてください。

引用返信 編集キー/
■63279 / inTopicNo.4)  Re[3]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ タケイ (1回)-(2012/08/10(Fri) 05:48:29)
> コンストラクタも、プロパティも、イベントハンドラも分からないのです。
> よろしければ例文で教えてください。

コンストラクタも、プロパティも、イベントハンドラも基本的なことなので、
これらが理解できないとマルチスレッドを理解するにはハードルが高いのでは?
何故別スレッド処理を行いたいのでしょうか?
引用返信 編集キー/
■63280 / inTopicNo.5)  Re[3]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ shu (29回)-(2012/08/10(Fri) 07:45:59)
2012/08/10(Fri) 07:46:10 編集(投稿者)
No63278 (高橋 さん) に返信
> ありがとうございます。
> さっぱり分からないです。
> コンストラクタも、プロパティも、イベントハンドラも分からないのです。
> よろしければ例文で教えてください。

コンストラクタ呼び出し: New Form1
新しくForm1を作成します。既に存在しているForm1があったとしても別になります。

プロパティ:
Property PropName As Integer
    Get
        Return _PropNamaValue
    End Get
    Set(value as Integer)
        _PropNamaValue = Value
    End Set
End Property

イベントハンドラ:
AddHandler Ctl.Click, AddressOf Ctl_Click
or
Private Sub Ctl_Click(sender as Object, e as EventArgs) Handles Ctl_Click
End Sub


そして別スレッドなのでFormのインスタンスを渡してもTextBox.Textへの値設定は
駄目なので、TextBox1.InvokeとかForm1.Invokeなどを使うかBackGroundWorkerによる実装に
変更してRepotProgressによりProgressChangedイベントを発生させる方法にした方が
よいと思います。そもそもスレッドを分ける必要のあることなのでしょうか?

引用返信 編集キー/
■63284 / inTopicNo.6)  Re[4]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ 高橋 (5回)-(2012/08/10(Fri) 12:07:17)
ありがとうございます。

ループ処理を行うダウンロードツールの途中経過の報告にテキストボックスに文字列を表示させたいのです。
マルチスレッドじゃないとフォームが固まるのです。
引用返信 編集キー/
■63286 / inTopicNo.7)  Re[5]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ shu (31回)-(2012/08/10(Fri) 12:14:51)
No63284 (高橋 さん) に返信
> ありがとうございます。
>
> ループ処理を行うダウンロードツールの途中経過の報告にテキストボックスに文字列を表示させたいのです。
> マルチスレッドじゃないとフォームが固まるのです。
そういうのならBackGroundWorkerがおすすめです。
引用返信 編集キー/
■63288 / inTopicNo.8)  Re[6]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ 高橋 (6回)-(2012/08/10(Fri) 12:34:36)

> そういうのならBackGroundWorkerがおすすめです。

ありがとうございます。
BackGroundWorkerを調べてみます。
引用返信 編集キー/
■63290 / inTopicNo.9)  Re[7]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ 高橋 (7回)-(2012/08/10(Fri) 20:36:28)
クラス分けしてもあまりメリット無さそうなので
Form1.vb上にスレッドを書くようにします。

解決済み
引用返信 編集キー/
■63291 / inTopicNo.10)  Re[5]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ Azulean (10回)-(2012/08/10(Fri) 23:08:20)
2012/08/10(Fri) 23:08:34 編集(投稿者)

No63284 (高橋 さん) に返信
> ループ処理を行うダウンロードツールの途中経過の報告にテキストボックスに文字列を表示させたいのです。
> マルチスレッドじゃないとフォームが固まるのです。

マルチスレッドプログラミングは難易度の高いことです。
ちょっとしたことなら困らないかもしれませんが、きちんと考えて作らないとタイミングによる不具合が多数発生する可能性があります。
基礎をおろそかにせず、用語を理解した上で、マルチスレッドのデザインパターンなどの書籍も読んでみましょう。


// 「例文だけよこせ」では、本質を理解できません。
// 今の問題は回避できるかもしれませんが、後にツケを回しているだけなのでご注意を。
解決済み
引用返信 編集キー/
■63292 / inTopicNo.11)  Re[6]: スレッドからフォームのテキストボックに文字列を表示させたい
□投稿者/ ???´ (1回)-(2012/08/10(Fri) 23:46:20)
2012/08/10(Fri) 23:51:30 編集(投稿者)
2012/08/10(Fri) 23:47:39 編集(投稿者)

>
> マルチスレッドプログラミングは難易度の高いことです。
> ちょっとしたことなら困らないかもしれませんが、きちんと考えて作らないとタイミングによる不具合が多数発生する可能性があります。
> 基礎をおろそかにせず、用語を理解した上で、マルチスレッドのデザインパターンなどの書籍も読んでみましょう。
>
>
> // 「例文だけよこせ」では、本質を理解できません。
> // 今の問題は回避できるかもしれませんが、後にツケを回しているだけなのでご注意を。

名前は書き忘れたけど、高橋です。

すみません。
たしかにその通り。
その後、見つけたこの例文で質問したやりたかったことは一応できたけど、応用するのは難しいですね。
基本から勉強し直します。
http://blog.livedoor.jp/akf0/archives/51335400.html
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -