2009-07-29 9 views
0

現在、私のソケットから読み取ったデータを表示しようとすると、私のGUIがフリーズしています。私が1つまたは2つのメッセージを表示するときに凍結しているのではなく、多くのメッセージ(1秒あたり2〜3)を受け取ったときだけです。私は非同期ソケット(非ブロッキング)を使用しています。私はguiにデータを表示する方法に関連していると思います。コード:WindowsフォームのGUIソケットを使用してフリーズ

public class Globals 
{ 

    public static MainDialog myDialog; 
} 

public partial class MainDialog : Form 
{ 
    public MainDialog() 
    { 
     InitializeComponent(); 
     Globals.myDialog = this; 

    } 
    public void sendText(string text) 
    { 
     logBox.AppendText(text); 
     logBox.AppendText("\n"); 
    } 
} 

次に、自分のネットワーククラスからGlobals.myDialog.sendText(..)を呼び出します。私が言ったように、それはうまく動作しますが、すぐにたくさんのメッセージを受け取ったときではありません。

誰もがアイデアを持っていますか?

答えて

0

また、他のスレッドからGUIコントロールへの更新を呼び出すときには、InvokeRequiredをチェックすることを忘れないでください。

+0

ありがとうございます、うまく動作します。 :) –

+0

以前にもこれがあっただけで、必要な物件をすぐに見つけなければなりませんでした。X-) –

2

コードを見ると、ソケットからデータを読み取るネットワーククラスが別のスレッドにないと思います。 BackgroundWorkerクラスを使用してソケットデータを実行し、ProgressChangedを呼び出してデータをGUIに戻します。 Hereは、ジョブを実行し、GUIをアップレートするためのBackgroundWorkerの設定方法の良い例です。

+0

非同期はフードの下でスレッディングを行います。したがって、スレッドは別スレッドになります。それでも、私はInvokeRequiredとBeginInvokeを使って修正しました。 –

+0

BackgroundWorkerを使用している場合、InvokeRequiredが必要ではありません。あなたのためにそれを処理します。 – SwDevMan81

+0

ありがとう、後でそれを見てみましょう。 –

0

いつでも、テキストボックスを何回も更新すると、インターフェイスが応答しなくなることがあります。

ネットワーキングスレッドでメッセージをバッファリングし、タイマーを使用してTextBoxを1秒に1回だけ更新することを考えてみましょう。

+0

私はInvokeRequiredとBeginInvokeを使って修正しました。ありがとう! –

関連する問題