2011-02-10 70 views
2

我正在開發一個小應用程序。需要你的幫助。GUI中的C#多線程方法

我有一個10列的表。說,我在列表視圖中選擇5行。 我將列表中的col_1的所有值都傳遞給一個方法。

如果所有值相等,則設置combo_box1值=「相等」,否則值=「不等於」。

當前的方法:

我有10名列表(?似乎很跛腳......是不是我問過關於這個疑問句......),每一個山坳。

10調用檢查值是否相等的方法,每個調用一個列表。隨後,設置組合框的(10個組合框)值。

如果我有100條記錄,我估計所花的時間會增加。所以,我想到了實現線程。

的精力投放:

我已經使用了this.Invoke(新的委託...)針對嘗試訪問主線程的控制線程的方法。它工作正常。我試圖根據我的需要操縱這個。不能這樣做。請幫幫我。

[編輯]

的罪魁禍首是圖像比較......其採取相當長的時間才能完成......下面是代碼... 我存儲的所有圖像(比如山坳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是罪魁禍首...

[編輯2]

傢伙...需要你的幫助......任何想法...如何比較圖像的列表...除上述以外的.. 。

感謝,

開發

+0

首先,根據你在做什麼,增加記錄到100應該不會有太大的差別,特別是如果你只是在列表上幾次解析。其次,我們需要更多的信息。你是如何嘗試操縱你的線程調用的?你希望線程如何工作? – 2011-02-10 15:30:00

+0

事情是列數可以增加...我想打電話,說3個線程...每個處理3列......這樣.. – Dev 2011-02-10 15:32:33

回答

2

實現一個線程設計有自己的開銷和增加了複雜性。如果性能足夠差以保證增加的複雜性,那麼您真的只想考慮轉向線程模型。

如果您有100行,並且您檢查的是10列的平等,那麼您正在進行1000次平等檢查。根據實施情況,這應該是一個微不足道的操作,性能影響可以忽略不計。

考慮分析您的應用程序以查看是否存在性能問題。

編輯
根據您的調查結果(即圖像比較是罪魁禍首),你可能要考慮使用針對相應的圖像字節數組一個簡單的校驗和比較。

下面是如何做到這一點的例子: http://www.dreamincode.net/code/snippet2859.htm

注:MD5是在這種情況下,充足,應被證明是稍快。

+0

好吧..在分析後,我發現誰造成延誤...我編輯了主要問題...... – Dev 2011-02-10 16:53:45

2

我會說,而不是使用調用,檢查出BackgroundWorker。它具有自動在主線程上運行的回調事件,因此當您更容易完成時更新UI,以避免跨線程UI異常。檢查

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

worker.RunWorkerAsync(); 
0

的一種方式,如果列表中的所有元素都是相同的是把它們塞進一個HashSet並檢查HashSet項目金額算賬:如果你只有一個項目,那麼他們都是平等的...