0

この質問のタイトルにどのようにアプローチすればよいかわからなかったので、疑問が明確になることを願って状況を説明します。(もっといいタイトルがあれば変更します)

ここ数日間、そのシナリオを使用したマルチスレッドと GUI コントロールの変更について読んでいます。私の質問は、変更するコントロールをデリゲートとメソッドのパラメーターとして渡すことに関係しています。ListView1 があり、それにグループを追加したいとしましょう (これは単純なエクスペリエンスであり、コードはほとんどありません)。

私が見た例によると、それを行う方法は次のようになります

Private Delegate Sub ResultsAddGroup_Delegate(ByVal FondsGroup As ListViewGroup)

Private Sub ResultsAddGroup(ByVal FondsGroup As ListViewGroup)
    If Me.ListView1.InvokeRequired Then
        Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup)
        Dim ParamArgs() As Object = New Object() {FondsGroup}
        Me.ListView1.BeginInvoke(d, ParamArgs)
    Else
        Me.ListView1.Groups.Add(FondsGroup)
    End If
End Sub

私は通常、コードを明確にし、メソッドや関数を特定のコントロール オブジェクトから遠ざけるために、コントロールをパラメーターとして渡すのが好きです。上記のケースのパラメーターとして ListView を渡したい場合は、次のようになります。

Private Delegate Sub ResultsAddGroup_Delegate(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup)

Private Sub ResultsAddGroup(ByVal LView As ListView, ByVal FondsGroup As ListViewGroup)
    If LView.InvokeRequired Then
        Dim d As New ResultsAddGroup_Delegate(AddressOf ResultsAddGroup)
        Dim ParamArgs() As Object = New Object() {LView, FondsGroup}
        LView.BeginInvoke(d, ParamArgs)
    Else
        LView.Groups.Add(FondsGroup)
    End If
End Sub

それは、マルチスレッドと制御変更の目的で何らかの問題を表すでしょうか? もしそうなら、コントロールを指定せずにこれを行う別の方法はありますか?

別の注意として、私が通常メソッドを実行する方法に問題はありますか (上記のように、コントロールをパラメーターとして渡す)?

ありがとう

4

1 に答える 1

0

私自身、いくつかのプロジェクトで 2 番目のパターンを使用しました。Ctrl.InvokeRequired はスレッドセーフであるため、仕事をしているようです。コントロールは単なるオブジェクト参照であるため、コントロールをパラメーターとして使用しても問題ありません。

その最初のコードブロックでは、オブジェクト配列の初期化に小さなエラーがあり、これは意図されていると思います:

Dim ParamArgs() As Object = New Object() {FondsGroup}

しかし、何かが足りない場合に備えて、変更することをためらっています:)

于 2012-11-05T21:52:10.190 に答える