我正在开发一个小应用程序。需要您的帮助。
我有一个 10 列的表。假设我在 ListView 中选择 5 行。 我将 col_1 的所有值放在一个列表中,将其传递给一个方法。
如果所有值都相等,则设置combo_box1 value =“equal”,否则value =“not equal”。
当前方法:
我有 10 个列表(看起来很蹩脚...不是吗?我问了一个关于这个的问题...),每列一个。
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]
伙计们...需要你们的帮助...任何想法...如何比较图像列表...除上述之外...
谢谢
开发
最佳答案
我想说,不要使用 Invoke,而是查看 BackgroundWorker
。它具有在主线程上自动运行的回调事件,因此可以在完成后更轻松地更新 UI,从而避免跨线程 UI 异常。
BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += (s, e) => updateUI();
worker.DoWork += (s, e) => longProcess();
worker.RunWorkerAsync();
关于GUI 中的 C# 多线程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958940/