2011-01-11 22 views
1

私はC#WinFormsアプリケーションで作業しています。非モーダルダイアログをポップアップして再描画し、メインウィンドウ/フォーム。C#WinFormsの子フォームがShow()後に再描画されない

メインウィンドウでは、SerialPortを使用して、シリアル転送レシーバで絶えず増加しているデータ転送数を表示しています。

モーダルで動作するように見えるShowDialog()を使用できますが、ダイアログが使用されている間、メインウィンドウのデータカウンタがフリーズし、最終的にシリアルバッファがオーバーランすると思います。

私はShow()を使用したいと思いますが、これを行うと半透明の画面にダイアログが表示され、それ以上描画されない(対話的に別のウィンドウをドラッグするとゴミ箱になります)。私はメインのアプリケーションウィンドウを閉じるまで、それはオンスクリーンのままです。

おそらく、私は別のスレッドを開始する必要がありますか、おそらく間違ったことをしています。私は通常(おかげで、コメンター)コメントの後にC#またはWindowsプログラミング(。多分あなたが言うことができる)

編集をしない:

私は多分ほとんどのものはシリアルイベントハンドラを受け取るどんなスレッドで実行されますなっていると思います下に呼び出されます。

com.DataReceived += new SerialDataReceivedEventHandler(SerialRxHandler); 

私はスレッドを気にするように書かれているだけのコードは、私が持っていた見つかったリストボックスをカウンタを更新し、ログインするためにいくつかの関数、である:私のアプリを起動すると、私は、シリアルを、処理するためのクラスを作成します

delegate void SetCountDelegate(TextBox tb, int count); 
internal void SetCount(TextBox tb, int count) { 
    // thread switch magic 
    if (InvokeRequired) { 
     BeginInvoke(new SetCountDelegate(SetCount), new object[] { tb, count }); 
    } else { 
     tb.Text = String.Format("{0}", count); 
    } 
} 

だから多分私は(表示しようとするべきではありません)このスレッド上のフォームを:私はスレッドの切り替えについての苦情を取得停止するために、いくつかのInvokeRequiredでラップします。別のInvokeRequiredブロック、または私は何かを完全に異なったものにするべきですか?

+0

コードを投稿してください。あなたはUIスレッドのシリアルポートから読んでいますか? –

+0

あなたは 'ShowDialog'の代わりに' Show'を使う必要がありますが、UIを複数のスレッドから更新しようとするべきではないでしょう。アプリケーションのフリーズを引き起こす原因を確認できるようにコードを投稿できますか?シリアルポートのアクセスを別のスレッドに切り替える必要があるかもしれません。 –

答えて

0

コメンターと思考のビットに促され

..私は自分自身にお答えしますと仮定し、私は私の子ダイアログ)を呼び出すには()を作成し、ショー(しようとする前に、UIスレッドへの切り替えを行いました。それはうまくいった。

関連する問題