其他分享
首页 > 其他分享> > CodeGo.net>如何正确使用“使用”命令?

CodeGo.net>如何正确使用“使用”命令?

作者:互联网

我刚刚创建了这个帐户,所以如果我忘记了一些重要信息,请原谅我.

我有以下代码,但我怀疑内存泄漏.该代码的目标是从(模拟)摄像机的图像中获取字节,并使用这些字节生成EmguCV图像.问题在于生成的数组的长度永远不会保持不变.当我生成300×300的图片时,我希望该数组包含90000个条目.但是,这种情况很少发生.这个数字在不断变化.

我试图按照一些有关如何正确使用“ using”命令来处理变量的教程进行操作,但是到目前为止,我还是失败了.据我所知,我正在使用的字节列表似乎没有IDisposable函数.所以这可能是我失败的原因:/

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.Structure;

namespace opencv_test
{
    class Program
    {
        static void Main(string[] args)
        {
            Stemmer.Cvb.Image image = new Stemmer.Cvb.Image(300, 300);
            image.Initialize(125);
            List<byte> values = new List<byte>();
            CopyPixelWithValue(image, values);

            byte[] myArray = values.ToArray();

            Emgu.CV.Image<Gray, Byte> test = new Image<Gray, Byte>(300, 300);
            test.Bytes = myArray;
            test.Save("D:/abc.jpg");
        }

        static unsafe void CopyPixelWithValue(Stemmer.Cvb.Image toGetValuesFrom, List<byte> values)
        {
            int width = toGetValuesFrom.Width;
            int height = toGetValuesFrom.Height;
            var toCopyData = toGetValuesFrom.Planes[0].GetLinearAccess();

            byte* toCopyBase = (byte*)toCopyData.BasePtr;
            long toCopyYInc = toCopyData.YInc.ToInt64();
            long toCopyXInc = toCopyData.XInc.ToInt64();

            Parallel.For(0, height, y =>
            {
                var pSrcLine = toCopyBase + y * toCopyYInc;

                for (int x = 0; x < width; x++)
                {
                    var srcVal = *(pSrcLine + x * toCopyXInc);
                    values.Add(srcVal);
                }
            });
        }
    }
}

非常感谢您提供有关如何解决此问题的帮助!!

解决方法:

您的问题是,您正在使用并行循环将值添加到“值”列表,同时在多个线程中访问同一列表,这是不安全的,并且会破坏数据.将其更改为常规循环,您可能不会有任何问题.

标签:using-statement,c
来源: https://codeday.me/bug/20191108/2005525.html