2009-08-01 13 views
1

現在、私は理解できない奇妙な問題を抱えています。私は、1つのボタン& 1つのricheditboxと、簡単なGUIを持っています。私は非同期ソケットを実行している、私はgui(richeditbox)に印刷したいネットワーク上のいくつかのデータを受信して​​います。非同期ソケットは、ユーザーがボタンを押したときに開始されます。私は、ネットワークデータを受信したときだから私はそれが(Form1のクラスで)のように見えるここでどのように、データを印刷する機能を呼び出す:非同期ソケットを使用するWindowsフォーム。テキスト出力なし

Public Sub AddText(ByVal text As String) 

Try 

    Console.WriteLine(text) 
    RichTextBox1.AppendText(text) 
    RichTextBox1.AppendText(vbNewLine) 

Catch e As Exception 
    Console.WriteLine(e.ToString()) 
End Try 

End Sub 

その後、私は単に私のネットワーククラスまたはモジュール(それは関係ありませんからForm1.AddText(..)を行います?)。問題は、AddText関数が呼び出されているにもかかわらず、例外もエラーもなく単に何も表示されなくても、richeditboxに何も表示されないことです。私はデバッガでそれを見て、"text"には印刷しなければならなかったデータが含まれていましたが、単純に何も表示されません。誰でもアイデアはありますか?

答えて

1

ソケットが別のスレッド(もちろん非同期であるため)で動作している場合は、InvokeRequiredを使用して、RichTextBoxにテキストを表示させる必要があります。非同期シリアルポートリスナーのリスナーにも同様の問題がありました。

+0

dlgUpdate(のAddressOf updateLog) RichTextBox1.Invoke(D、テキスト) エルス RichTextBox1.AppendText(テキスト) END IF End Subの 注:私は、GUIスレッドからそれを呼び出す場合updateLog機能が動作しますので、私はそれを推測それに関連していますが、InvokeRequiredを使用した後もまだ動作しない理由はわかりません。 –

+0

uh ..それは醜く見えます、コメントでコードを見ることができない、私はコードを取ったから:http://www.vbdotnetforums.com/asp-net-data-access/19740-how-use-invokerequired .html –

+0

これは暗い提案かもしれませんが、UIスレッドがロックされている場合は、テキストを追加した後でApplication.DoEvents()を投げてみることができます。 – David

1

私はDavidが正しいと確信しています。ここに例があります。

Delegate Sub AddTextDelegate(ByVal text as String) 

Public Sub AddText(ByVal text as String) 
    If Me.InvokeRequired Then 
     Me.Invoke(new AddTextDelegate(AddressOf Me.AddText), new object() { text }) 
    Else 
     Try 
      Console.WriteLine(text) 
      RichTextBox1.AppendText(text) 
      RichTextBox1.AppendText(vbNewLine) 
     Catch e as Exception 
      Console.WriteLine(e.ToString()) 
     End Try 
    End If 
End Sub 

作成したスレッドでコントロールを更新する必要があります。 AddText()ルーチンが非同期ソケットのスレッドのコンテキストで呼び出されているようです。 AddText()ルーチンは再帰関数のように動作します。最初に呼び出されると、InvokeRequiredプロパティがtrueになります。これにより、正しいスレッドにデータをマーシャリングするためのInvoke()呼び出しによって再び呼び出されます。 2回目に呼び出されると、InvokeRequiredはfalseになり、コントロールが更新されます。

+0

うーん、まだ動作しません。私はデバッガでチェックしたところ、InvokeRequiredと呼ばれる関数は "false"でした。そして、まあ、それはそれに関連しています。なぜなら、デバッグするとき、addText関数が "MainThread"から呼び出されていないことがわかるからです。ご協力いただきありがとうございます! –

+0

私は、AddText関数がMainThreadから呼び出されているとき(Form1_Loadなど)にのみ機能することを意味しました。 –

0

修正済み。 Form1を関数呼び出しに使用することはできませんでした。これは型であり、diffスレッドのために独自のメモリを持つ新しいvarのようなものです。だから私はInvokeRequiredをチェックしたとき、Form1がそのスレッドに属していてフォームが見えないのでテキストが表示されていなかったのでfalseと言っていました。だから、パブリックmyForm As Form1などのグローバル変数を作成し、Form1_LoadでmyFormをForm1に割り当てました。新品同様RichTextBox1.InvokeRequiredが= trueの場合、 薄暗いdの場合 サブupdateLog(文字列としてByValテキスト) を/ プライベートデリゲートサブdlgUpdate(文字列としてByValテキスト) :私はすでにそれを試してみましたが、同じ結果まし

関連する問題