2012-03-15 11 views
0

私の問題はこれです。私にはパネルが入ったフォームがあります。このパネルは、複数の異なるユーザーコントロールのコンテナとして機能し、一度に1つしか表示されません。上記のユーザーコントロールの中には、DBから多くのデータを表示するものがあるため、読み込みに時間がかかります(データはバインドされたデータグリッドビューで表示されます)。これらのコントロールのLoadDataメソッドを作成して別のスレッドで起動し、作業を終えたら、メインフォームの実際のボタンを有効にして表示しました。winformsと同時データ読み込み

しかし、多くの異なる問題がありました。まず、this.Invokeを呼び出すことはできません。ハンドルが作成されるまで、特に初期化中にスプラッシュ画面を表示したい場合は、ハンドルが作成されるまで押し込んでください(メインフォームのハンドルはまだ作成されていません)。

これを強制するには、form.Visible = trueを設定し、form.CreateControlを呼び出してからform.visible = falseを呼び出してください。しかし、これは画面上でフォームが点滅しているように見えますが、見栄えが良くありません。

ハンドルがまだ作成されていない場合でもInvokeを使用しないようにしましたが、データオブジェクトが別のスレッドで作成され、コントロールの「通常の」スレッドでアクセスできないという問題が発生します。

おそらくかなり明らかですが、マルチスレッドの場合は特に失われています。特にwinformsの場合、さらにはアプリケーションの起動時に失われます。私の説明もやや混乱するかもしれませんが、私はそれが必要かどうかを明らかにします。

これを行う正しい方法は何ですか?

+0

データをロードしているときにユーザーがプログラムとやり取りできない場合は、スレッド内でデータのロードを移動するのは意味がありませんか? – Steve

+0

データが少ないコントロールはスプラッシュ中にロードされ、すぐに利用できます。 – bobblez

答えて

0

どこから始めるべきか分かりません。

あなたの問題が時期尚早の楽観的なものか、レトロフィットのマルチスレッドのものかを判断できません。

私が6つのボタンと1つのパネルを言っていて、ボタンがユーザーコントロールを表示するようにフリップされた場合、Myスレッドはユーザーコントロールを返し、パネルに追加して関連ボタンを有効にします。

すべての同期化を式から取り除き、コントロールの取得と設定の最適化範囲を最大限に引き出します。

あなたはすべてのユーザーコントロールを設定できますが、それらをバインドしてスレッドを完了時にバインドすることはできません。以前の方法よりも優先されます。少し抽象化され、ビューを定義して、有用な属性であり、ちょうどそれを行うプロセスを開始するための主要なフォームを取得します。

+0

これは、レトロフィッティングのマルチスレッド化の問題です。そして、はい、コントロールとパネルの機能の説明はかなり正確です。そして、これは良い解決策のように思えますが、どのようにしてスレッドが何かを返すことができますか?私はそのようなことが可能であったことさえ知りませんでした。 – bobblez

+0

Googleスレッド。データをスレッドに開始または渡す –

+0

これは私が使用しているものですが、それはスレッドにデータを渡しています。返すスレッドではありません。しかし、まあ、私はそれを把握することができますね。 – bobblez