0

サップガイズ、

frmMain クラスに関数があり、呼び出し後にコントロールを別のものに更新します。イミディエイト ウィンドウに「?Label1.Text」と入力すると、テキスト プロパティが更新されますが、フォームを確認しても何も起こりません。コードはこんな感じ

Public Sub UpdateUI()
    If (Me.InvokeRequired = True) Then
        Invoke(New MethodInvoker(AddressOf UpdateUI))
    End If
    Label1.Text = "ITS NOT WORKING =\"
End Sub

私の bgWorker クラス:

Private threadUpd As New Threading.Thread(AddressOf Updater)
Private _active as Boolean
Public Sub New()
    _active = True
    threadLimpar.IsBackground = True
    threadLimpar.Start()
End Sub

Public Sub Updater()
    Do
        If (_active = False) Then
            Try
                Thread.Sleep(Timeout.Infinite)
            Catch ex As ThreadInterruptedException
            End Try
        Else
            if(condition...) then
              frmMain.UpdateUI
        End if
    Loop
End Sub
4

3 に答える 3

3

これは VB.NET の古典的な罠です。スレッドを使い始めると、誰もが少なくとも 1 回は陥ります。

frmMain.UpdateUI

これで、「frmMain」が正確に何を意味するのかわかりません。しかし、この質問を投稿したという事実は、frmMain がメイン フォーム クラスの名前であることを示唆しています。メイン フォームへの参照を格納するクラス内のフィールドの名前ではありません。

それはうまくいきません。変数であるかのようにクラスとして参照できるようにするために VB.NET コンパイラが生成する変数には、<ThreadStatic>セマンティクスがあります。つまり、すべてのスレッドがフォームの独自のインスタンスを作成します。次のように書くと、それを見ることができます。

frmMain.UpdateUI
frmMain.Show

しかし、ウィンドウの「ゴースト」が表示されます。それ以外の場合は、ウィンドウが作成されたスレッドがメッセージ ループをポンピングしていないため、ドアネイルとして死んでいます。

フォームへの実際の参照が必要です。Updater がフォーム クラスのメソッドである場合、それは「Me」である可能性があります。そうでない場合は、Application.OpenForms で提供できます。最善の方法は、コンストラクターを介して Updater を含むクラスにフォームへの参照を与えることです。

于 2010-01-02T23:14:58.067 に答える
2

InvokeRequired が true を返す場合は、おそらく関数を終了する必要がありますが、とにかくラベル テキストを設定しています。できることは次のとおりです。

Public Sub UpdateUI()
    If (Me.InvokeRequired = True) Then
        Invoke(New MethodInvoker(AddressOf UpdateUI))
    Else
        Label1.Text = "ITS NOT WORKING =\"
    End If
End Sub
于 2010-01-02T22:48:56.160 に答える
1

私はあなたが次のことを望んでいると思います:

Public Sub UpdateUI()
    If (Me.InvokeRequired) Then
        BeginInvoke(New MethodInvoker(AddressOf UpdateUI))
    Else
        Label1.Text = "ITS NOT WORKING =\"
    End If
End Sub
于 2010-01-02T22:49:28.633 に答える