2011-02-10 6 views
2

私は小さなアプリケーションを開発しています。君の力が必要。GUIでC#のマルチスレッドアプローチ

私は10列のテーブルを持っています。言う、私はリストビューで5行を選択します。 col_1のすべての値を取得し、リスト内でメソッドに渡します。

すべての値が等しい場合は、combo_box1 value = "equal"、else value = "not equal"と設定します。

現在のアプローチ:

私は10本のリストを持っている(かなりラメようだ...それはない私は、このに関するQUESを求めていた...?)、各COLについて1。

10値の等しいかどうかをチェックするメソッドを1つのリストに対して呼び出します。その後、コンボボックス(10コンボボックス)の値を設定します。

もし私が100のレコードを持っているとすれば、時間がかかると思います。だから、私はスレッドを実装すると思った。入れ

努力:

私はメインスレッドのコントロールにアクセスしようとしたスレッドのthis.Invoke(新しい委任...)アプローチを使用しています。それはうまく動作します。私は自分の必要に応じてこれを操作しようとしました。それはできませんでした。みんなを助けてください。

[EDIT]

主犯はあるコード... 私は、すべての画像を保存しています(と言う...その...は以下を完了するために恐ろしく長い時間をかけて画像比較しましたCOL NO 3)リスト中の10行...

// other stuffs [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] private static extern int memcmp(IntPtr b1, IntPtr b2, long count);

// create a list of images MemoryStream imageStream = new MemoryStream(tempImage.Data.Data); Bitmap artCoverImage = new Bitmap(imageStream); // culprit ? artCoverList.Add(artCoverImage);

// call the method CheckIfEqual(artCoverList) // culprit ?

// THE method private void CheckIfEqual(artCoverList) { Bitmap tempBitMap = artCoverList[0];

foreach (Bitmap bmp in artCoverList) { if (bmp == null) return false; if (bmp.Size != tempBitMap.Size) return false; var bd1 = tempBitMap.LockBits(new Rectangle(new Point(0, 0), tempBitMap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd1scan0 = bd1.Scan0; int stride = bd1.Stride; long len = stride * tempBitMap.Height; var bd2 = bmp.LockBits(new Rectangle(new Point(0, 0), bmp.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd2scan0 = bd2.Scan0; returnValue = memcmp(bd1scan0, bd2scan0, len) == 0; bmp.UnlockBits(bd2); tempBitMap.UnlockBits(bd1); } }

が、私はこの部分の画像比較が作業を取得するために一日を過ごしていた...私はそれはMEMの変換部分を考えると言いませんストリームをbmpに犯人は...

ある[EDIT 2]

男...あなたの助けを必要と...任意のアイデアを...上記以外の画像の一覧を...比較する方法..ねじ切り設計を実装する。

おかげで、

のDev

+0

最初に、何をやっているかによって、レコードを100に増やしても、それほど大きな違いはありません。次に、より多くの情報が必要です。どうやってスレッドコールを操作しようとしましたか?スレッドはどのくらい正確に動作しますか? –

+0

ものが増える可能性のある列の数です...私は3つのスレッドを...それぞれの3つの列を処理するように呼び出したいと思います... – Dev

答えて

2

は独自のオーバーヘッドを持っており、複雑さを追加します。追加された複雑さを保証するのに十分なパフォーマンスが得られない場合は、実際にはスレッドモデルへの移行を検討するだけです。

100個の行があり、10個の列が等しいかどうかを確認している場合、1000個の等価チェックが行われます。実装によっては、これはわずかな操作であり、パフォーマンスの影響は無視できます。

アプリケーションのプロファイリングを検討して、パフォーマンスの問題がないかどうかを確認してください。あなたの知見に基づいて

EDIT
(その画像比較が犯人である)、あなたはそれぞれの画像のバイト配列に対する簡単なチェックサムの比較を使用して検討する必要があります。ここで

はこれを行う方法の一例です: http://www.dreamincode.net/code/snippet2859.htm

注:MD5、この場合には十分であり、わずかに速いことを証明する必要があります。

+0

よく..プロファイリングした後に遅延を引き起こしているバグを見つけました...私は主な質問を編集しました... – Dev

+0

私はMD5の比較が私が使ったものより遅いと聞いています...このアプローチの前に多くの研究をしました...両方の方法で取られた時間を比較します参照してください...私はストリームからビットマップ生成中に時間がかかっていると思う...画像を処理する他の方法は...ですか? – Dev

2

私は、Invokeを使用する代わりに、BackgroundWorkerをチェックします。これには、が自動的にのメインスレッドで実行されるコールバックイベントがあります。これにより、スレッド間UIの例外を回避するために、簡単に済むとUIが更新されます。その後、彼らはすべて同じである、あなたは一つだけのアイテムを持っている場合は、次のリスト内のすべての要素が同じであるかどうかを確認するために

BackgroundWorker worker = new BackgroundWorker(); 
worker.RunWorkerCompleted += (s, e) => updateUI(); 
worker.DoWork += (s, e) => longProcess(); 

worker.RunWorkerAsync(); 
+0

これを見ていただけるとありがとうございます... – Dev

+0

遅延が発生するのは1つの列だけであることがわかったので、複数のスレッドは役に立ちません。時間がかかるスレッドが終了するまで待つ必要があります終わり。スレッドのオーバーヘッドは他の列の利点を上回ります。 –

+0

メインスレッドで100列のうち99個を処理していて、この時間がかかる別の列で99個のプロセスを処理すると、私はプロセス全体をスピードアップできると思っていました... – Dev

0

一つの方法は、HashSetにそれらを詰め込む、その後HashSetでアイテムの量をチェックすることです...