2011-09-26 8 views
0

私は基本的にForm1のテキストボックスに行を書き込む例外ハンドラ関数があります。これは正常に動作してもうまく動作しますが、2番目のスレッドはプロパティにアクセスできないプロセスを開始するためにスレッドを使用します。例外がスローされていないが、テキストがテキストボックスに書き込まれません。スレッドからForm1プロパティにアクセスする

Public Sub ExceptionHandler(ByVal Description As String, Optional ByVal Message As String = Nothing) 
    ' Add Error To Textbox 
    If Message = Nothing Then 
     Form1.txtErrLog.Text += Description & vbCrLf 
     Log_Error(Description) 
    Else 
     Form1.txtErrLog.Text += Description & " - " & Message & vbCrLf 
     Log_Error(Description, Message) 
    End If 
    MessageBox.Show("caught") 
End Sub 

が、このようスレッドからフォームのプロパティにアクセスすることは可能ですか、テキストファイルまたは同様に書き込み、テキストボックスをリフレッシュするために容易になるだろう10秒ごとにプロパティが表示されます(このオプションは良いオプションではありませんが、これが唯一の方法であれば!)。

また、まだVBに新しいので、私は良い練習ではない何かをしたら私に教えてください!

答えて

2

いいえ、「間違った」スレッド(つまり、そのコンポーネントのイベントポンプを実行するスレッド以外のスレッド)からGUIコンポーネントのプロパティにアクセスしないでください。 Control.Invoke/BeginInvokeを使用して、右側のスレッドでデリゲートを実行することができます。

このWeb上では、多くのチュートリアルがあります。多くはC#のサンプルで記述されますが、基礎となる情報は言語に依存しません。例えば、Joe Albahari's threading tutorialを参照してください。

1

代理人を使用する必要があります。 VBで代理人を検索します。

ここでは、仕事をするコードの平和。

Delegate Sub SetTextCallback(ByVal text As String) 

(文字列としてByVal TX)パブリックサブdisplay_message

「prüfenOB呼び出しnötigイスト Me.RichTextBox1.InvokeRequired場合は、新しいSetTextCallback(のAddressOfのdisplay_message) Me.Invoke(Dとその後 薄暗いD 、TX) エルス tx.Trim() Me.RichTextBox1.Text = TX エンド

End Sub 

の場合
関連する問題