簡體   English   中英

GUI中的C#多線程方法

[英]C# multi-thread approach in GUI

我正在開發一個小型應用程序。 需要你的幫助。

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

如果所有值均相等,則將combo_box1的值設置為“等於”,否則將值設置為“不等於”。

當前方法:

我有10個清單(似乎很la腳...是嗎?我問了一個有關此的問題...),每個清單一個。

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

如果我說100條記錄,我估計花費的時間將會增加。 因此,我想到了實現線程。

投入的精力:

我已經使用this.Invoke(new Delegate ...)方法來嘗試訪問主線程的控件。 工作正常。 我試圖根據自己的需要進行操作。 無法這樣做。 請幫我。

[編輯]

罪魁禍首是圖像比較...完成它花了很長時間...下面是代碼...我正在列表中存儲所有說10行的圖像(比如說第3行)...

// 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]

伙計們...需要您的幫助...任何想法...如何比較圖片列表...除上述之外...

謝謝,

開發

實施線程設計有其自身的開銷,並增加了復雜性。 您確實只想在性能差到足以保證增加的復雜性的情況下考慮使用線程模型。

如果您有100行,並且要檢查10列的相等性,那么您要進行1000次相等性檢查。 根據實現的不同,這應該是微不足道的操作,並且對性能的影響可以忽略不計。

考慮對應用程序進行性能分析,以查看是否存在性能問題。

編輯
根據發現(圖像比較是罪魁禍首),您可能要考慮對各個圖像字節數組使用簡單的校驗和比較。

這是有關此操作的示例: http : //www.dreamincode.net/code/snippet2859.htm

注意:在這種情況下,MD5就足夠了,應該證明速度稍快一些。

我想說的是,而不是使用Invoke,請查看BackgroundWorker 它具有自動在主線程上運行的回調事件,因此它使您在完成操作后更新UI更加容易,從而避免了跨線程UI異常。

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

worker.RunWorkerAsync();

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM