2017-12-07 15 views
0

私はメインスレッドにリッチテキストボックスを用意しています。私は呼び出しを使用してこれを実行しようとしましたが、動作させることができません。私はそれをしようとした場合:別のスレッドからUI要素にアクセスしようとしているVB.netが動作していません

If InvokeRequired Then 
    Dim Dgate As writeLogDelegate = New writeLogDelegate(AddressOf writeLog) 
    BeginInvoke(Dgate, New Object() {Message}) 
Else 
    RTB_Log.AppendText(Message) 
End If 

その後、InvokeRequiredはtrueそれが必要とハンドルが戻りfalseを作成しているかどうかのチェックなどを返しませんが、私はをIsHandleCreated の値を取得する場合、フォームのロード時に、それはtrueを返します。 。

Threadクラスの抜粋:

Public Sub startClientPoll(ByRef Sender As TcpListener) 
    Dim TThread As New Thread(New ParameterizedThreadStart(AddressOf pollClientConnect)) 
    TThread.Start(Sender) 
End Sub 
Private Sub pollClientConnect(tcplistener As TcpListener) 
    Do 
     If tcplistener.Pending() Then 
      'MessageBox.Show("") 
      RaiseEvent clientConnecting() 
     End If 
    Loop Until Ended = True 
End Sub 

イベントハンドラクラスの抜粋:

Private Sub client_Connect() Handles listenerSocket.clientConnecting 
    Form1.writeLog("New client awaiting accept" & vbNewLine) 
    Dim clientSocket As TcpClient = listenerSocket.AcceptTcpClient() 
    Dim clientHandler As New MPClientReciever(clientSocket) 
End Sub 

メインフォームスニペット:

Public Sub writeLog(ByVal Message As String) 
    If Not IsHandleCreated Then 
     CreateControl() 
    End If 
    If InvokeRequired Then 
     Dim Dgate As writeLogDelegate = New writeLogDelegate(AddressOf writeLog) 
     BeginInvoke(Dgate, New Object() {Message}) 
    Else 
     RTB_Log.AppendText(Message) 
    End If 
End Sub 
+1

'Form1.writeLogを持つ任意のコントロールで、このFunctionを使用することができます...'デフォルトのように見えるものスレッドでうまくやっていないフォームインスタンス – Plutonix

+0

これがあれば、より良い方法がありますか? – Champgoblem2

+0

バックグラウンドスレッドで 'CreateConrol()'コントロールを作成していますか? – LarsTech

答えて

2

あなたが書き込みを起動しようとするための私の方法はとても似ていますあなたのクラスのSubを以下のように定義することができます:

Private Delegate Sub AddText_DL(ByVal txtControl As Control, ByVal txtVAL As String, ByVal append As Boolean) 
Private Sub AddText(ByVal txtControl As Control, ByVal txtVAL As String, ByVal append As Boolean) 
    If txtControl.InvokeRequired = True Then 
     Dim progDel As New AddText_DL(AddressOf AddText) 
     Dim parameters(2) As Object 
     parameters(0) = txtControl 
     parameters(1) = txtVAL 
     parameters(2) = append 
     txtControl.Invoke(progDel, parameters) 
    Else 
     If append = True Then 
      txtControl.text &= txtVAL 
     Else 
      txtControl.text = txtVAL 
     End If 
    End If 
End Sub 

あなたはUIコントロールのプロパティにアクセスし、その設定値を取得したい場合は、あなたの代わりに使用することができ、

AddText(MyTextBoxObject, "add this text please, don't append", False) 

そして、あなたの参考のために呼び出し、別のスレッドでそれを使用するには:

Private Delegate Function CheckedStatus_DL(ByVal checkable As Control) As Boolean 
Function CheckedStatus(ByVal checkable As Control) As Boolean 
    If checkable.InvokeRequired = True Then 
     Dim gridDel As New CheckedStatus_DL(AddressOf CheckedStatus) 
     Dim parameters(0) As Object 
     parameters(0) = checkable 
     Return checkable.Invoke(gridDel, parameters) 
    Else 
     Return checkable.checked 
    End If 
End Function 

また、あなたが.Checked財産

+0

レイトバインディングを推奨しないでください。代わりに、コントロールのパラメータをByVal txtControl As Controlと宣言してください。そうすれば、メソッドに渡すことができるものに制限を課すこともできます。 –

+0

スレッドに利用可能なフォームへの参照を設定して、 'instance.DoSomething'を呼び出すことができました。皆様のおかげです。 – Champgoblem2

+0

@VisualVincent true遅延バインディングについて同意して編集しました。それを指摘してくれてありがとう –

関連する問題