DOBON.NETプログラミング道掲示板

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■33737 / inTopicNo.1)  非同期デリゲートとスレッドプール
  
□投稿者/ dice1024 一般人(1回)-(2017/12/04(Mon) 20:59:48)
  • アイコン環境/言語:[VB.net .NET Frameworkのバージョン(1.1, 4.0 共通)] 
    分類:[.NET] 

    みなさま
    初めまして
    大輔と申します

    現在マルチスレッドを勉強してしています
    これまでメインスレッドで全部処理する書き方ばかりしていたため難しい箇所が多いのですが、並列で動作した時の楽しさは比較になりません
    今は管理人どぼん様がかれこれもう12年近く前に投稿されたCodezineさんの記事を読んでいます
    https://codezine.jp/article/detail/139
    私のやりたいことをほぼ網羅しているのですが、どうしてももう一歩踏み込んだことがしたいです
    上記リンク先に記載されていたソースを編集して以下のようにしました

    'Invokeメソッドで使用するデリゲート
    Delegate Function WriteLineDelegate(ByVal str As String) As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


    ' メインスレッドで処理したいことを書く(あくまで一例として本日の日付を取得しlongdaydateに代入します)
       Dim longdaydate As String = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

    'メインスレッドに名前をつける(名前は直ぐ上で取得したlongdaydateです)
    System.Threading.Thread.CurrentThread.Name = longdaydate


    'WriteLinesメソッドを別スレッドで呼び出す
    'スレッドの作成
    Dim t As New System.Threading.Thread( New System.Threading.ThreadStart( AddressOf WriteLines))
    'スレッドを開始する
    t.Start()
    End Sub

    '別スレッドで実行するメソッド
    Private Sub WriteLines()
    '現在のスレッドの名前を取得(ここで本日の日付のストリングデータが受け渡されます)
    Dim threadName As String = ystem.Threading.Thread.CurrentThread.Name

    'WriteLineDelegateの作成
    Dim dlg As New WriteLineDelegate(AddressOf WriteLine)

    'TextBox1に文字列を追加する
    Dim count As Integer = CInt(Me.Invoke(dlg, New Object() {threadName}))
    End Sub

    'TextBox1に文字列を追加する
    Private Function WriteLine(ByVal str As String) As Integer

    TextBox1.AppendText (str)

    Return TextBox1.Lines.Length
    End Function

    -----------------------------------
    これでメインスレッドからではなく別のスレッドからtextbox1に日付が入力されます
    Button1_Clickを別のスレッドからいくつも並行して呼んでもtextbox1に日付が次々入力されます

    ここからが本題です
    スレッドの名前を経由してストリングを渡すという方法を取っているため、複数の変数やストリング以外のデータを渡すのにとても苦労します
    あくまで元のページのサンプルソースはどちらがメインスレッド、サブスレッドをわかるように名前をつけているのであり、このような使い方は想定していないはずです
    どのようにすればFunction WriteLineで変数longdaydateをTextBox1.AppendText (longdaydate)として入力できるか教えてください

    よろしくお願いいたします
マルチポストを報告
違反を報告
引用返信 削除キー/
■33738 / inTopicNo.2)  Re[1]: 非同期デリゲートとスレッドプール
□投稿者/ Hongliang 大御所(538回)-(2017/12/05(Tue) 11:35:32)
  • アイコン
    // 質問内容のどこにも「非同期デリゲートとスレッドプール」が関わっていませんが…。
    
    3つぐらい方法は考えられます。
    
    ' 画面反映用の共通メソッド
    Sub WriteText(ByVal line As String)
      If Me.InvokeRequired Then
        Me.BeginInvoke(New Action(Of String)(AddressOf WriteText), line)
        Return
      End IF
      Me.TextBox1.Text = line
    End Sub
    
    ' (1) ParameterizedTrheadStartを使用する .NET 1.1から
    Sub StartThread1()
      Dim thread As New Thread(AddressOf Me.WriteText)
      thread.Start("test")
    End Sub
    Sub WriteText(ByVal line As Object)
      Dim strLine = CStr(line)
      Me.WriteText(strLine)
    End Sub
    
    ' (2) Classを使用する Action(Of T)は.NET 2.0から
    Sub StartThread2()
      Dim worker As New Worker("test", AddressOf Me.WriteText)
      Dim thread = new Thread(AddressOf worker.DoWork)
      thread.Start()
    End Sub
    Class Worker
      Public Sub New(ByVal line As String, ByVal reporter As Action(Of String))
        Me.m_Line = line
        Me.m_Reporter = reporter
      End Sub
      Private m_Line As String
      Private m_Reporter As Action(Of String)
      Public Sub DoWork()
        Me.m_Reporter(Me.m_Line)
      End Sub
    End Class
    
    ' (3) ラムダ式を使用する ラムダ式でのSubはVB10, Visual Studio 2010から
    Sub StartThread3()
      Dim thread As New Thread(Sub() WriteText("test"))
      thread.Start()
    End Sub

違反を報告
引用返信 削除キー/
■33741 / inTopicNo.3)  マルチスレッド動作時メインスレッドからサブスレッドに値を渡したい
□投稿者/ dice1024 一般人(3回)-(2017/12/05(Tue) 20:11:26)
  • アイコンホンリャンさん

    早速のレス本当にありがとうございます
    三つ目がもっとも短く綺麗にかけそうですので、これを組み込んで見ようと思います
    ラムダ式とAddressOfとはなんなのかがまだ理解できていないためまず先に学びます

    >
    > ' (3) ラムダ式を使用する ラムダ式でのSubはVB10, Visual Studio 2010から
    > Sub StartThread3()
    > Dim thread As New Thread(Sub() WriteText("test"))
    > thread.Start()
    > End Sub

    動くコードが書ければ共有のために追記します
    重ねてありがとうございました

    タイトルは以下のように変更します
    ”マルチスレッド動作時メインスレッドからサブスレッドに値を渡したい”
違反を報告
引用返信 削除キー/



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

このトピックに書きこむ

Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -