0

基本的にはこの質問ですが、VB.netの場合です。CheckBoxメインスレッドとは別のスレッドから状態を確認する必要があります。リンクされた質問の解決策には、C# コードが含まれています。オンライン翻訳者は、理解できる結果をもたらしません。

私のコード(重要な部分まで取り除いたもの):

Public Class UI
    'UI contains CheckBox1.
End Class

Public Class Worker
    Public Sub Input()
        Dim thrMyThread As New System.Threading.Thread(AddressOf Run)
        thrMyThread.Start()
    End Sub

    Public Sub Run()
        If UI.CheckBox1.Checked = True
            MsgBox("True")
            ShellandWait("application.exe")
        Else
            MsgBox("False")
            ShellandWait("application.exe")
        End If
    End Sub

End Class

ShellandWaitプロセスを開始し、終了するまで待機するカスタム関数です。そのためShellandWait、UI の応答性を維持するために別のスレッドが必要です。

更新の状態を表すワーカー クラスの先頭にブール変数を
定義することで回避策を見つけました。そう:PublicUI.CheckBox

Public Class Worker
    Public cB As Boolean = UI.CheckBox.Checked
    ... 'Rest of Code
    Public Sub Run()
        If cB = True
            MsgBox("True")
            ShellandWait("application.exe")
        Else
            MsgBox("False")
            ShellandWait("application.exe")
        End If
    End Sub
End Class
4

1 に答える 1

1

これはうまくいくはずです。このコードにより、ワーカー スレッドから GUI にアクセスできるようになります。

Public Delegate Function GetCheckBoxChekedDelegate(cb As CheckBox) As Boolean

Public Function GetCheckBoxChekedFunction(cb As CheckBox) As Boolean
    Return cb.Checked
End Function

Public Function GetChecked(cb As CheckBox) As Boolean
    If cb.InvokeRequired Then

        Dim del As GetCheckBoxChekedDelegate
        del = AddressOf GetCheckBoxChekedFunction


        Dim parArray() As Object = {cb}

        Return CBool(cb.Invoke(del, parArray))
        'Return CBool(cb.Invoke(del, New Object() {cb}))
        'Return CBool(cb.Invoke(del, {cb}))

    Else
        Return cb.Checked

    End If
End Function

GetChecked関数を使用して、チェックボックスのチェック状態を取得できます。この関数は、メイン スレッドとワーカー スレッドの両方で機能します。

GetChecked関数がワーカー スレッドから呼び出されると、InvokeRequiredtrue を返すため、cb.Invoke(del, {cb})コマンドによってメイン スレッドで呼び出される関数GetCheckBoxChekedFunctioncb.Checked値が読み取られます。

于 2012-05-22T08:13:05.013 に答える